徒然に某キ~タでTeX/LaTeX関連の記事を拾い読みしていたら、トッテモ面白い🤯TeX言語のコードを発見した。ちょうど「TeX言語GW特別キャンペーン🍀」の期間中なので、クイズの形で紹介することにする。
そのコード
最近よくみるtcolorbox関連の記事であるが、今の話において重要な部分のコードを抜粋する。
\newcommand{\kara}{} %無を出力するコマンド \newtcolorbox[auto counter, number within=section, crefname = {Def.}{Defs.}]{definition}[3][] {enhanced, breakable = true, fonttitle = \bfseries, title = Def.~\thetcbcounter~\if #2\kara \else(#2) \fi, #1, label = thm:#3}
\newtcolorbox
で新しい(tcolorboxの機能を利用した)“definition環境”を定義するコードであるが、注目してほしいのはこの部分である。
\if #2\kara \else(#2)␣\fi
ここで、#2
は新しく定義されたdefinition環境の第2引数(第1引数はオプション引数なので最初の必須引数)である。すなわち、definition環境は以下のような書式をもつが、この中の«名称»
の部分が#2
になる。
\begin{definition}[«追加オプション»]{«名称»}{«ラベル»} «内容» \end{definition}
記事の後の方を見ると、次のような記述がある。
つまり「#2
が空になる」という使用法も想定されていることがわかる。では #2 が空だった場合に何が起こるのか、というのがこの記事(クイズ)のトピックである。
実際に#2
を空にしたコードを考えてみよう。
\if \kara \else()␣\fi
\if
の直後に\kara
があるが、これは以下のように定義されたマクロである。
\newcommand{\kara}{} %無を出力するコマンド
\if
は「展開不能な2つのトークンを引数に取る」という仕様をもつため、\if
の直後に展開可能なトークンがある場合はそれは展開される。\kara
を展開すると単に消えるだけなので、結局、\kara はこのif文の実行結果に何の影響も与えない。要するに、先のif文は次のコードと等価になる。話を簡単にするため以下ではこのコードを考える。
\if \else()␣\fi
この\if
文は、明らかに奇怪な形をしている。普通は\if
の直後に比較対象となる2つのトークンがあるはずだが、この文ではそれがなくて\if
の後にいきなり\else
が出現している。
というわけでクイズ
\if \else()␣\fi
このトークン列を完全展開した結果はどうなるか? 次の選択肢の中から正しいものを選ぼう。
※“\relax
モドキ”とは「実行された場合の挙動は\relax
プリミティブと全く同一だが、\relax
プリミティブとは意味が異なる(\ifx
-等価でない)ような特殊なトークン」のことを指す。
(正解は後日発表🙃)