「1 進数」とかいうと何やら高級概念そうだが、要するにこういうこと。
仕様!
というわけで、次のような仕様の命令 \unaryWith
を実装することにしよう。(仕様は大事!)
\unaryWith{<テキスト>}{<カウンタ名>}
: 任意の文字(テキスト)を用いた“1 進数”でカウンタの値を出力する。<テキスト>
の出力がカウンタの数値の回数だけ反復される。<テキスト>
は頑強(robust)である必要がある。- “カウンタ出力命令”(
\theナントカ
)の定義本体の中で使うことができる。
例えば、先の図に示した出力は、upLaTeX を用いて次のコードにより生成される。
\renewcommand{\theenumi}{\unaryWith{☃}{enumi}} \begin{enumerate} \item はれ \item くもり \item あめ \end{enumerate}
実装!
“カウンタ出力命令”の実装については先日の記事で解説した。今回は“汎用”の命令である点がチョット違うが、基本的な方針は同じだろう。とりあえず、\format@ナントカ
に相当するものをまず作ろう。
% \xx@format@unary@with{<テキスト>}{<整数>} % テキストを指定の回数反復して出力する. \DeclareRobustCommand*{\xx@format@unary@with}[2]{% 保護付にする \begingroup \count@=#2\relax \@whilenum{\count@>\z@}\do{% #1% \advance\count@\m@ne}% \endgroup}
例の記事の教示に従って、整数(#2)は“どんな形式でも”受け付けるようにしておいた。
もしここで、〈☃〉の 1 進数をするための \theenumi
を直接定義するとなると、以下のようになるだろう。
\renewcommand*{\theenumi}{% \xx@format@unary@with{☃}{\the\c@enumi}}
所望の \unaryWith
命令はこの本体中の \xx@format@unary@with
の引数を“可変”にしたものといえる。とりあえず単純に以下のようにしてみよう。
\newcommand*{\unaryWith}[2]{% \xx@format@unary@with{#1}{\the\@nameuse{c@#2}}}
この定義の下で、最初に示した(\unaryWith
を用いた)\theenumi
が「出力命令が上手くいく条件」を満たすかを検討してみよう。(カウンタ enumi の値を 2 とする。)
- “普通の状態”では
\theenumi
は(\unaryWith...
を経て)\xx@format@unary@with{☃}{\the\@nameuse{c@enumi}}
に展開される。\unaryWith
の第 2 引数は“整数なら何でもよい”のだから、正当に enumi の数値である 2 と解釈されるはず。だから全体の出力は「☃☃」となり OK である。 - 保護付完全展開した場合、
\theenumi
や\unaryWith
は保護付でないので\xx@format@unary@with...
に展開される。これをさらに保護付完全展開すると:\xx@format@unary@with
自体は保護付だから展開されない。- 第 1 引数“☃”は普通の文字だからそのまま。なお、一般にはこの引数に LaTeX 命令が含まれうることに注意してほしい。ところが、仕様により、この引数は頑強であるといえるので、保護付完全展開しても問題は起こらない(それが“頑強”の定義である)ことが保証される。
- 第 2 引数“
\the\@nameuse{c@enumi}
”は enumi の数値の数字である“2
”に展開される。
\xx@format@unary@with{☃}{2}
”となる。enumi の値が参照されているので OK である。 - “
\xx@format@unary@with{☃}{2}
”を普通の状態で実行すると、enumi の値は参照されずに「☃☃」が出力されるので OK である。
以上よりここで作った \unaryWith
は「上手くいく」ことが確かめられた。以上に示したコードを組み合わせて実際に☃する文書(冒頭の図の出力を行うもの)を作ることは、アレな読者への課題とする。
寿司!
無事に☃し終わったので、今度は🍣することにしよう。
% 文字コードは UTF-8 \documentclass[a4paper,uplatex]{jsarticle} \usepackage[twitter]{coloremoji} \renewcommand{\coloremojidir}{emoji_images/} \makeatletter %!!!!!!!!!!!!!!!!! TeX code BEGIN \DeclareRobustCommand*{\format@unary@with}[2]{% \begingroup \count@=#2\relax \@whilenum{\count@>\z@}\do{% #1% \advance\count@\m@ne}% \endgroup} \newcommand*{\unaryWith}[2]{% \format@unary@with{#1}{\the\@nameuse{c@#2}}} \makeatother %!!!!!!!!!!!!!!!!! TeX code END \setlength{\leftmargini}{5zw} \renewcommand{\theenumi}{% \unaryWith{\coloremoji{🍣}}{enumi}} \begin{document} {\TeX}言語の本の一覧: \begin{enumerate} \item 黄色 \item 緑 \item 独習 \label{独習} \item 作法 \end{enumerate} なお、\ref{独習}は「もっと黄色い本」とも呼ばれる。 \end{document}
これでもう「カウンタ出力命令」は怖くないね!