TeXを利用してネームプレートを作成する方法について(1): TeXソースの作成
始めに
abc the eighthから,直近のabc the14thまで,参加者に渡すネームプレートを作成し続けています.(以下,abcの各大会については,”8th”や”14th”のように回数のみで表記することとします.) 8thの頃はWordの差し込み印刷機能を利用してネームプレートを作成していましたが,自分の技術的知識が向上したことや,環境の変化などによって,TeXを用いてより効率的なネームプレート作成が可能となりました. ここでは,LaTeXによるネームプレート作成をどのように行っているのかについて,その技術的な詳細を説明します. この記事を読む皆様には,是非他大会などで御参考にして頂ければ幸いです.
TeX(というよりTikZ)によるネームプレートのデザイン
まず,ネームプレートそのものがどういうデザインなのかについては,14thのネームプレートサンプルを以下にリンクしましたので,そちらをご覧ください.なお,以下では,このサンプルの1ページ目のことを「順位面」,2ページ目のことを「名前面」と呼ぶことにします.
これをどのようにしてTeXで書くかということですが,現代的な解答の一つはTikZを用いることだと思います. TikZはTeX用の描画パッケージの一つで,非常に高度な機能を持っています. 例えば,TikZ and PGF examplesを見れば, このパッケージを使ってどこまで綺麗な図が描けるのか,その一旦がすぐにわかると思います. ネームプレートを作成するという点においては,ここまでの描画能力は必ずしも必要ではありませんが, コード自体も書きやすく,後で色々とデザインで「遊べる」ということからしても,TikZは非常に有力だと思っています.
実際,上のネームプレートを生成するluatexのコードは以下の通りです.
\AssignOrder{順位}
で順位の面,\AssignName{順位}{名前}{学校}{学年}
で名前の面を割付します.
ちなみに,
- 出力エンジンは
lualatex
を使用.lualatex nameplatex14th_sample.tex
でpdfが生成されます. - フォントは源真ゴシックを使用.
- 14thのロゴが必要ですが,これは公式サイトのトップにあるものと同じ.
となってますので,このままファイルをダウンロードしてコンパイルするときはご注意下さい.
簡単なコードの説明
\AssignName
についてだけここでは説明します.
\newcommand*{\AssignName}[4]{%
\rule{0.3cm}{0cm}\\
\vfill
\begin{tikzpicture}
% デザイン調整用のグリッドです.本番の出力時にはコメントアウトしてください.
%\draw [help lines] (0,0) grid (28,20);
% 名前・所属教育機関・学年の配置
\node[above right] (order) at (0,18) {\ResizeAsBox{10cm}{1.5cm}{#1}};
\node[above] (name) at (14,7) {\ResizeAsBox{28cm}{10cm}{\textbf{#2}}};
\node[above] (school) at (8,1) {\ResizeAsBox{16cm}{4cm}{#3}};
\node[above] (grade) at (23,1) {\ResizeAsBox{12cm}{4cm}{#4}};
\end{tikzpicture}
\vfill
\newpage
}
tikzpicture
環境の内部が実際に「図」として描いている部分になります.
tikzにおける\node
命令については,tikzのマニュアルやTeX Wiki
を参照して頂ければいいのですが,何をしているのかは実際のコードを読んでもすぐにわかると思います.
一つ言えば,above
やabove right
というオプションは,
参照点(at
の後ろにある座標)に対して文字({}
の中身)をどこに配置するかを指定します.
このオプションを用いると位置指定がしやすいと思います.
さて,\AssignName
と\AssignOrder
の定義中で,\ResizeAsBox{<幅>}{<高さ>}{<文字列>}
という命令を別個定義して使用しています.
\newlength{\ResizedHeight}
\newcommand*{\ResizeAsBox}[3]{%
\settoheight{\ResizedHeight}{\resizebox{#1}{!}{#3}}
\ifthenelse{ \lengthtest{\ResizedHeight < #2} }{%
\resizebox{#1}{#2}{#3}
}{
\resizebox{!}{#2}{#3}
}
}
この命令は,「幅」と「高さ」で指定された長方形の中にピッタリ収まるように「文字列」を拡大して配置するのですが,
文字を拡大縮小する際に,縦長になることは許すが,横長になることは許さない という方針を取っています.
これは,横長の文字はどうしても不恰好になるためです.
ですので,\ResizeAsBox
の定義内では,
- 一旦,文字列を指定した幅になるまで縦横等倍で拡大する.
- そのときの文字列の高さを長さ変数の
\ResizedHeight
に定義する. - これを指定された高さと比較し,
- オーバーしていれば高さに合わせて縦横等倍拡大.
- オーバーしていなければ,幅と高さの両方に合わせて不等倍拡大.
という計算をしています.
因みにこの条件分岐を実現するため,ifthenパッケージを利用しています. これについては,以下のページを参考にしました.
LaTeX で条件分岐や反復処理:ifthen パッケージのキホン
多少のこころがけ
8th以降ネームプレートを作成する際に気をつけていることとして,デザインを少しずつ変える というのがあります. 毎年同じようなデザインにするより,一瞥して「これはあのときのやつだ」と思い出してもらえるようにというのがその心です. 最近はtwitterやfacebookに,自分のこれまで獲ってきたネームプレートを並べて写真を撮る人達が増えてきました. それを見る度に,「ちゃんとデザインを変えておいてよかったな」と思ったりしています.
以前は毎年デザインに凝っていたのですが, 最近は大会ロゴが毎年作成されるようになったので, 大会ロゴを貼りつけるだけの簡単な作業で差別化を図ることができています. ちなみに上のサンプルファイルを見るとわかると思いますが, 14thのネームプレートでは,(私が携わって)初めて順位面をカラー印刷にしました.(これまではモノクロでした.) こういうところでも少しずつ変化をつけていくようにしてます.
次回はtexファイルをもとに実際のネームプレートを作る作業について説明します.