TeXの記憶(42) — \@ifundefinedの残念な例

自分で作った\@ifundefinedの例を探していたら、なんだか残念な例を見つけたので紹介します。単に\@ifundefinedを使ってみたかっただけという例になってしまいました。

ある書籍を編集するさいに、初出の人名だけ特別な処理をして、2度目以降はその名前だけ普通に表示するという決まりがありました。

本文の内容は原稿・初校と変更が多いものだったので、修正していくうちに初出の順番が分からなくなってしまいました。分量が多く自分で調べるのも面倒です。そこで出てくるたびに人名を\csnameで登録すれば初出が分かって便利と思って作ったマクロです。

draftオプションのときだけ色が付き、最終的には何もなかったように文字列を出力します。

% #1 -- 登録名
% #2 -- 表示名
\ifdraft
\def\zName#1{\@ifundefined{#1}{\zxName{#1}}{\zyName{#1}}}
\newcommand{\zxName}[2]{\expandafter\gdef\csname #1\endcsname{}%マクロの内容は無い
  \textcolor{magenta}{#2}}
\newcommand{\zyName}[2]{\textcolor{green}{#2}}
\else
\newcommand{\zName}[2]{#2}
\fi
□□□□□□□□□□□□□\zName{pascal}{パスカル}□□□□□□□□□□□
□□□□□□□□□□□□□\zName{pascal}{パスカル}□□□□□□□□□□□
□□□□□□□□□□□□□\zName{pascal}{パスカル}□□□□□□□□□□□
□□□□□□□□□□□□□\zName{pascal}{パスカル}□□□□□□□□□□□

0913

人名を\csnameで登録だけして、未登録だったらマゼンタで出力、登録済みだったら緑で表示しています。この例だと\pascalが登録されますが中身は空です。

こんなことするならauxのようなファイルに書き出したほうが良かったんじゃないかと思っています。

コメント