マクロツイーター

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

野生の難解TeX言語クイズ

徒然に某キ~タでTeX/LaTeX関連の記事を拾い読みしていたら、トッテモ面白い🤯TeX言語のコードを発見した。ちょうど「TeX言語GW特別キャンペーン🍀」の期間中なので、クイズの形で紹介することにする。

そのコード

qiita.com

最近よくみる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

※「空白トークンになる空白」をで表した1

ここで、#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

このトークン列を完全展開した結果はどうなるか? 次の選択肢の中から正しいものを選ぼう。

  1. ()␣ (ただしは空白文字トークン)
  2. トークン列
  3. \relax
  4. 単一の“\relaxモドキ”からなるトークン列
  5. その他

※“\relaxモドキ”とは「実行された場合の挙動は\relaxプリミティブと全く同一だが、\relaxプリミティブとは意味が異なる(\ifx-等価でない)ような特殊なトークン」のことを指す。

(正解は後日発表🙃)


  1. ただし「そこに空白トークンがあること」はこの記事の話題とは無関係である。