2014年3月5日水曜日

LaTeXではがきの宛名を作る

MacやLinuxを使っていて困ることに、日本独特の文章があります。
Windowsなら用意されている便利なテンプレートがMacにはありませんから、年賀状にしても縦書きの文章を作るにしても困ることになります。
もちろんお金があればWindows機が別にあってそれを使って作ることができるでしょうし、絵を描くためにMacを使っているユーザーであればIllustratorの力技で作ることもできるでしょう。ただそれは「ちょっとした用途」のためだけで考えるにはあまりにも高価……できれば無料で、仕上がりが綺麗で、将来的にWindowsに移った後も同じデータが利用できる、というのが理想じゃないですか。
そこでLaTeXの出番です。
LaTeXとは、論文の作成を目的として開発されたマークアップ言語(ラッパであるLaTeXがマークアップ、TeX自体は関数型言語だとも言われます)のことであり、日本ではアスキーが管理するplatexが広く使われます。Mac、Windows、Linuxの全てのプラットフォームで動作し、誰もが無料で利用することができます。

今回はそれを使ってはがきの宛名を作ります。2円切手が復活したということでなかなかのタイムリーな話だと思います。
年賀状を作る時に便利です。MacやLinuxでも動作するのが嬉しい限りです。
例の通り、テストとして打ってある名前や住所はでたらめです。

ソースコードはここからダウンロードしてください。
emagital.com/Blogs/Address.zip
この記事では、「データを入力→自動でレイアウトしてプリント」するところまで扱います。
スクリプトやプログラムを組んでやれば、csvやデータベースからプロットしてまとめて印刷することもできますが、文量が増えてしまうのでこの記事では扱いません。とりあえず余白だけは作りますが、実作業については追々やりましょう。

1、つかいかた
Address.texをコンパイルするとpdfが出力されます。
Macのプレビューで印刷する場合は、サイズ調整は「100%」、用紙サイズは「はがき」にしてください。 あとは紙の厚さや印刷設定をして印刷をするだけです。
Address.texはこういう内容になっています。
%未設定時の情報を指定します
\input{System/default.tex}
%あなたの住所を設定しているファイルを指定します
\input{Sender/Sakon.tex}
%送り先の住所を設定しているファイルを設定します
\input{AddressList/Dosetsu.tex}

%switch文です。switchの値を変えると、レイアウトが変わります
\newcount\switch
\switch=1
\ifcase\switch
%switchが0の時、レターパックの住所欄に合わせて情報を印刷します
%枠に合わせてはさみで切って、住所欄にのり付けしてください
\input{System/Formats/LetterPack.tex}
\else
%switchが1以降の時、はがきに情報を印刷します
\input{System/Formats/Hagaki.tex}
\fi

\begin{document}

%描画関数です
\draw{}
\drawsenderinfo{}
%レターパックに出力する時は、下のDrawOptionを有効にすることで、送り品の詳細を書くことができます
%\drawoption{ソフトウェア}

\end{document}
送り先とあなたの住所を書き換える時は、Sender/Sakon.tex(あなたの住所)、AddressList/Dosetsu.tex(送り先の住所)をそれぞれ書き換えてください。ファイル名を変えた場合は、Address.texのパスも変える必要があります。
%名前
\def\sendername{島 左近}
%郵便番号
\def\senderaddressnumber{456-8876}
%住所
\def\senderaddress{山梨県甲府市山梨町四の七}
%電話番号
\def\senderphonenumber{050-0000-1111}
%名前
\def\receivername{立花 道雪}
%郵便番号
\def\receiveraddressnumber{123-5432}
%住所
\def\receiveraddress{大分県大分市大板町}
%二行目の住所
\def\receiversubaddress{マンションオオイタ三○八号室}
送り先の\receiveraddress、\receiversubaddressで住所が定義できます。同様にあなたの住所は\senderaddress、\sendersubaddressで定義できます。慣例的にLaTeXは関数名を全て小文字で書くため、ぱっと見た感じでは読みにくいこともあるのですが、「sender(sub)address」であり、subがつくと二行目になります。定義の有無を判別して内部でレイアウトを変えていますので、二行に分けないと崩れる、ということはありません。
ただ、住所や名前に半角英数を使うと文字が横に倒れます。

2、なかみの話
仕組みとしては名刺とあまり変わりません。位置合わせの必要な郵便番号はpicture環境、縦書きの住所はplextで拡張されたminipage環境で描画しています。
ただ、変わったことをしている場所が一カ所だけあります。郵便番号の字間を\kanjiskipで調整してしまうと、はがきの字間が調整しづらくなってしまいますし、文字サイズを変えた時にずれが出てくるため不適当なんです。
そこで下の関数を使って、一文字ずつパースして取得しています。
\makeatletter
%配列と変数の宣言
____\newcount\@faise
____\edef\numa{0}
____\edef\numb{0}
____\edef\numc{0}
____\edef\numd{0}
____\edef\nume{0}
____\edef\numf{0}
____\edef\numg{0}

%parse:文字列を分解し、配列に1文字ずつ入れていく
\def\parse#1 {
____%変数を初期化、引数もedefで展開して関数化する。
____\edef\@input{#1}
____\@faise=0
____%文字列を分解、forで一文字ずつ取得する。
____\expandafter\@tfor\expandafter\member
____\expandafter:\expandafter=\@input\expandafter\do{%

________%n文字目に対して処理を実行する
________\ifcase\@faise
____________\edef\numa{\member}%
________\or
____________\edef\numb{\member}%
________\or
____________\edef\numc{\member}%
________\or
____________%4文字目のハイフンには何もしない
________\or
____________\edef\numd{\member}%
________\or
____________\edef\nume{\member}%
________\or
____________\edef\numf{\member}%
________\or
____________\edef\numg{\member}%
________\else
________\fi

________%文字カウントを進める
________\advance\@faise by 1
____}
}
\makeatother
ざっくりと以上です。それでは、また。

0 件のコメント:

コメントを投稿