なんでもかんでもコンピュータ処理すればいいというわけではない。 向いているものは
で、逆に向いていないものは
となる。
個人で行なう典型的な「繰り返し」処理といえば「宛名書き」。 練習課題としても適している。
詳細は2003年の講座 のLaTeXの解説に。
LaTeXで宛名的なものを作成する場合は、
atena.tex
のような書き方になる。
LaTeXに限らず、文書の原稿は
という3つの部分で構成される。このうちの「本体」の繰り返しを Rubyプログラムで作成すると効果的な「自動化」になる。
住所データが以下のようなCSVで書かれているものと考えよう。
998-8580,山形県酒田市飯森山 3-5-1,公益太郎 998-8580,山形県酒田市飯森山 3-5-1,飯森花子 998-0862,山形県酒田市曙町 3.14159265,円山周三 998-0018,山形県酒田市泉町 2.71828,対馬数男 998-0854,山形県酒田市末広町 88888,富士吉宗 998-0075,山形県酒田市高砂 10451,高見山大五郎 998-0113,山形県酒田市広岡新田 1342,大金田博夫
上記のようなCSVを1行ずつ読み込み、区切りのカンマ文字で分割して データを読み取り、LaTeXの文書に合うように埋め込んだものを 出力するプログラムは以下のようになる。
while line=a.gets
line = line.chomp # 改行文字をはぎ取る
zip, address, name = line.split(",")
printf "\\begin{screen}
\\begin{minipage}{0.8\\columnwidth}
\\begin{alltt}
{\\large 〒%s
%s}
\\begin{center}
{\\huge %s 様}
\\end{center}
\\end{alltt}
\\end{minipage}
\\end{screen}\n", zip, address, name
end
LaTeXの記述部分(青字部分)が 多いので複雑に見えるが実際にRuby的な処理をしている部分に 着目すると以下のような単純なものとなる。
while line=a.gets line = line.chomp # 改行文字をはぎ取る zip, address, name = line.split(",") printf "〜〜 %s 〜〜 %s 〜〜 %s 様", zip, address, name end
ヘッダ部分と、フッタ部分を出力する部分を追加して プログラムは完成する。
#!/usr/bin/env ruby print IO.readlines("header") open("addr.csv", "r") do |a| while line=a.gets line = line.chomp # 改行文字をはぎ取る zip, address, name = line.split(",") printf "\\begin{screen} \\begin{minipage}{0.8\\columnwidth} \\begin{alltt} {\\large 〒%s %s} \\begin{center} {\\huge %s 様} \\end{center} \\end{alltt} \\end{minipage} \\end{screen}\n", zip, address, name end end print IO.readlines("footer")
プログラム実行時に2つのファイルを同じディレクトリに置いておく。
\documentclass[10pt]{jarticle} \usepackage{alltt} \usepackage{ascmac} \pagestyle{empty} \addtolength{\textheight}{2cm} \addtolength{\topmargin}{-1cm} \addtolength{\oddsidemargin}{-3cm} \addtolength{\evensidemargin}{-3cm} \setlength{\itemsep}{-0.5ex} \setlength{\parsep}{0ex} \begin{document} \thispagestyle{empty}
\end{document}
CSV形式で保存したファイルは、表計算ソフトで問題なく開くことが できる。
% soffice addr.csv &
逆に、表形式のデータをCSVとして書き出すこともできる。 ほとんどの宛名管理ソフトなどでは「CSVへの書き出し」が可能なので、 書き出したCSVファイルを処理する自作プログラムを作成して、 役立てると同時に技術を高めることもできる。