マクロツイーター

はてダから移行した記事の表示が崩れてますが、そのうちに直せればいいのに(えっ)

LaTeX カウンタの出力を1進数にしたい

「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 とする。)

  1. “普通の状態”では \theenumi は(\unaryWith... を経て)\xx@format@unary@with{☃}{\the\@nameuse{c@enumi}} に展開される。\unaryWith の第 2 引数は“整数なら何でもよい”のだから、正当に enumi の数値である 2 と解釈されるはず。だから全体の出力は「☃☃」となり OK である。
  2. 保護付完全展開した場合、\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 である。
  3. \xx@format@unary@with{☃}{2}”を普通の状態で実行すると、enumi の値は参照されずに「☃☃」が出力されるので OK である。
  4. 以上よりここで作った \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{&#127843;}}{enumi}}
    \begin{document}
    {\TeX}言語の本の一覧:
    \begin{enumerate}
    \item 黄色
    \item\item 独習 \label{独習}
    \item 作法
    \end{enumerate}
    なお、\ref{独習}は「もっと黄色い本」とも呼ばれる。
    \end{document}
    

    これでもう「カウンタ出力命令」は怖くないね!