"""
--この部分はコメントなので、そのまま実行できます--
csv2fig.py ver.1.0
LaTeX2e用 CSV -> Figure Convert Script
LaTeX2eで面倒な、Picture環境の指定をCSV(Comma Separated Value)形式で
入力するための支援スクリプトですが、まぁ、Pythonの実用例のサンプルぐら
いだと思ってください(TeXやLaTeX2eについては、適宜テキストを参照してく
ださい)
私のように、Pythonユーザで尚且つTeXユーザという方がどのくらいいるか疑
問なのですが、とりあえず実際に試験問題を作った際に使用したものに手を加え
て作ってあります。
Win32環境で使用した関係上、標準入出力を使用しています
(Win32環境でfile.readlines()を使うと、改行コードの関係でろくな目にあい
ません・・・)
実行は以下のように行ってください。
python csv2fig.py << input.csv >> output.tex
出力したコードは、そのままコンパイルして見られるように、ダミーヘッダ
とダミーフッタが入れてありますので、図を挿入する際は削除してください。
データ書式は以下のようになります
<最初の行>
Figureの位置指定,Picture領域のx座標,Picture領域のy座標,Caption,Label
■Figureの位置指定
Figure環境の位置指定(h,t,b,pのいずれか、あるいは組み合わせ)です。
■Picture領域のx座標,y座標
Picture環境の領域のx座標とy座標ですが、単位は10pt(ポイント)であることに
注意してください。これ以降の位置や長さの単位も、基本的に全て10pt単位と
なっています。
なぜかといえば、私自身が書いたファジーな図表には、1pt単位の指定が全く
必要でなく、全て0を余分に書いていたので、鬱陶しくてこうしました(細かい
単位が必要な方は、スクリプトを適宜改変してください)
■Caption,Label
それぞれ、\captionと\labelに対応しています。
<データ行>
データは、一行目以降、end.より前に書きます。
データ行には、Vector,Line,Point,Frameboxがあります。
データ行の第一カラムはデータの種類(v,l,p,f)を書き、第二カラムと第三
カラムは図の中の出力位置座標(開始位置)を書きます。
座標の単位はすべて10ptです。
<Vector>
Vector(矢印線)を出力します。フォーマットは以下のとおり。
v(vectorの識別記号),(開始点のx座標),(開始点のy座標),(傾き),(長さ)
傾きはr(right),l(left),u(up),d(down),ru,rd,lu,ld(その組み合わせ)の8種
類が指定できます。
また、傾きを記号で書かないでx,yの座標(-6〜6)で指定することもできますが、
その場合は第四カラムが傾きのx、第五カラムが傾きのy、第六カラムが長さと
なります。
長さは、x座標です(傾きのxが0の場合のみy座標…詳しくはLaTeX2eの教科書参
照)
例)(20pt,30pt)の位置から右方向へ50ptのベクトル線
<CSV>
v,2,3,r,5
あるいは・・・
v,2,3,1,0,5
<TeX>
\put(20,30){\vector(1,0){50}}
<Line>
Line(直線)を出力します。
l(lineの識別記号),(開始点のx座標),(開始点のy座標),(傾き),(長さ)
LineはVectorと異なり方向は無いので、傾きはv(vertical縦)h(horizontal横)
s(slash/)b(backslash\)の4種類です(Vectorと同じく、xy座標で傾きを記述
できます)。
開始点は、かならず左端です(垂直の場合は下)
例)(20pt,30pt)の位置から右上方向へ50ptの線
<CSV>
v,2,3,s,5
あるいは・・・
v,2,3,1,1,5
<TeX>
\put(20,30){\line(1,1){50}}
<Point>
線の交差を示す黒丸(3pt)を出力します(挿入位置指定だけです)
p,x座標,y座標
例)(30pt,20pt)の位置のドット
<CSV>
p,3,2
<TeX>
\put(30,20){\circle*{3}}
<Framebox>
指定の大きさの箱と、その中の文字を指定できます。
f,左下隅のx座標,左下隅のy座標,BOXの横幅,BOXの縦幅,挿入方向,挿入文字
挿入文字は書かなくともかまいませんが、区切りのカンマは書いてください。
文字は基本的に横書き専用ですが、文字を縦に配置する場合は、\\で区切っ
てください
例)(30pt,20pt)の位置の(50pt,20pt)の大きさの箱の中に「こんにちわ」
を横書きで・・・
<CSV>
f,3,2,5,2,こんにちわ
<TeX>
\put(30,20){\framebox(50,20){\shortstack{こんにちわ}}}
例)(30pt,20pt)の位置の(20pt,50pt)の大きさの箱の中に「こんにちわ」
を縦書きで・・・
<CSV>
f,3,2,2,5,こ\\ん\\に\\ち\\わ
<TeX>
\put(30,20){\framebox(20,50){\shortstack{こ\\ん\\に\\ち\\わ}}}
<データコメント>
行頭が;のデータは、その行をスキップします。
<コメント出力>
行頭が%の場合は、TeXドキュメントに出力するコメントを出力します。
<直接入力行>
行頭が@の場合は、処理をスキップしてその行を直接入力します。
行頭の@は、その際省かれます。
<終了宣言行>
end.
この文字を検出すると、処理が中断されますので、この行以降は何を書
いてもかまいません(終了宣言行にはこの文字だけで改行してください)
ちなみに、end.が無くても、行が終われば処理は終了します。
<空行>
改行だけの行はスキップしますので、見やすい区切りをつけてください。
"""
# csv2fig.py ver.0.1
# CSVファイルから、LaTeX2eのpicture環境に以降するスクリプト
# python csv2fig.py << input.csv >> output.texで使用・・・
import string
# 識別子(第一カラム)
# v vector
# l line
# p point(circle*)
# c circle(未実装)
# f framebox
# <変換関数群>
# d2v:Data to Vector
# <format>
# 識別子v,put x座標,put y座標,傾きx|方向子,傾きy|省略,長さ
# \put(a1,a2){\vector(a3,a4){a5}}
# ただし、a3がr,l,u,d,ru,rd,lu,ldに限り、a4は省略可能
# 式展開は省略型に準拠させる
def d2v(data):
i = string.split(data,',')
if i[3] == 'r': vxy = '(1,0)'
elif i[3] == 'l': vxy = '(-1,0)'
elif i[3] == 'u': vxy = '(0,1)'
elif i[3] == 'd': vxy = '(0,-1)'
elif i[3] == 'ru': vxy = '(1,1)'
elif i[3] == 'rd': vxy = '(1,-1)'
elif i[3] == 'lu': vxy = '(-1,1)'
elif i[3] == 'ld': vxy = '(-1,-1)'
else:
vxy='(' + i[3] + ',' + i[4] + ')' # 傾きを作って
i[4] = i[5] # 省略型にあわせる
rt = r'{\vector' + vxy + '{' + i[4] +'0}}'
return rt
# d2l Data to line
# <format>
# 識別子v,put x座標,put y座標,傾きx|方向子,傾きy|省略,長さ
# \put(a1,a2){\line(a3,a4){a5}}
# ただし、a3がv(vertical),h(horizontal),s(slash/)b(backslash\)
# の場合はa4省略可能
def d2l(data):
i = string.split(data,',')
if i[3] == 'v':lxy='(0,1)'
elif i[3] == 'h':lxy='(1,0)'
elif i[3] == 's':lxy='(1,1)'
elif i[3] == 'b':lxy='(1,-1)'
else:
lxy='(' + i[3] + ',' + i[4] + ')' # 傾きを作って
i[4] = i[5] # 省略型にあわせる
rt = r'{\line' + lxy + '{' + i[4] +'0}}'
return rt
# d2p:Data to Point
# 引数dataは、インターフェイス統一のためのダミーなので、
# csvファイルではputの座標を指定するだけ
def d2p(data):
return r'{\circle*{3}}'
# d2f:Data to Framebox
# Framebox format
# 識別子,put x,put y,大きさx座標(x10),大きさy座標(x10),文字
def d2f(data):
i = string.split(data,',')
rt = r'{\framebox('+i[3]+'0,'+i[4]+'0){\shortstack{'+i[5]+'}}}'
return rt
print '% 画像確認用ダミーヘッダ'
print r'\documentclass{jarticle}'
print r'\begin{document}'
# Picture環境,Figure環境
# <format>
# figure position,picture x,picture y,caption,label
# x10で指定
# pel:picture environment list
pel = string.split(raw_input(),',')
print r'\begin{figure}[' + pel[0] + ']'
print r'\begin{center}'
print r'\begin{picture}(' + pel[1] + '0,' + pel[2]+'0)'
#dataOptions:インターフェイス
dataOptions={'v' : d2v,
'l' : d2l,
'p' : d2p,
'f' : d2f}
while 1:
try:
data=raw_input()
except EOFError: # ファイル終末制御
break
else:
if data == 'end.': # 終了制御
break
elif data == '': # 空行スキップ
continue
elif data[0] == ';':# データ用コメント
continue
elif data[0] == '%': # TeXコメント出力
print '% ' + data[1:]
elif data[0] == '@': # 直接入力
print data[1:]
else:
k = string.split(data,',')
head = r'\put(' + k[1] + '0,' + k[2] + '0)'
foot = (dataOptions[k[0]])(data)
print head + foot
print r'\end{picture}'
print r'\end{center}'
print r'\caption{' + pel[3] + '}'
print r'\label{' + pel[4] + '}'
print r'\end{figure}'
print '% 画像確認用ダミーフッタ'
print r'\end{document}'
'''
<権利と免責>
このスクリプトはPDSとさせていただきますので、ご自由にお使いください。
ただし、このスクリプトを利用して何らかの不利益をこうむっても、一切
責任は負いませんので、自己責任で運用してください。
・・・とはいっても、たいしたコトになる筈は無いと思いますが・・・
vzz00500@nifty.ne.jp 機械伯爵
---サンプル(切り取ってご使用ください)---
h,20,15,チャート,chart2
;サンプルテキスト
l,1,13,h,4
f,5,12,6,2,時間経過
v,11,13,r,3
v,1,11,r,13
;下のコメントは出力されますが、これは出ません
%コメント1
f,14,10,4,4,A\\B
p,5,11
l,5,9,v,2
f,4,7,2,2,ア
v,6,8,r,8
%コメント2
f,14,7,4,2,C
p,8,8
l,8,6,v,2
f,7,4,2,2,イ
v,9,5,r,5
%コメント3
f,14,4,4,2,C
p,11,5
l,11,3,v,2
;円オブジェクトを挿入する正式なLaTeX2eコマンドです
@\put(50,50){\circle{20}}
f,10,1,2,2,ウ
v,12,2,r,2
f,14,1,4,2,文字列
end.
---これ以降は、何を書いても関係ありません。---
'''