マクロツイーター

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

暗黙的な波括弧は波括弧か波括弧でないか (3)

前回の続き)

前回は、環境の中身が「\hbox の波括弧の中」となるような環境(myfbox 環境)の定義を紹介した。これが可能だったのは、\hbox の波括弧は「暗黙的」である \bgroup...\egroup で代替が可能であったからである。ところが、もし環境の中身が「マクロの定義本体」であるようなものを作りたいという場合は話はもっと面倒になる。ちょっと不自然な状況設定になるが、次のような問いを考えよう。

\begin{defqverb}\制御綴〈内容〉\end{defqverb}\制御綴 を以下のようなトークン列に展開されるマクロに定義する: 〈内容〉の文字列を \ { } 以外は verbatim に解釈して((つまり、\ { } 以外の ASCII 記号類と空白文字はカテゴリコードを 12 とする。))得られるトークン列を完全展開したもの。つまり、「基本的に verbatim だけど制御綴は有効として、しかもマクロは展開する」という感じでマクロ定義するような環境を作りたい。

非常に判りにくいが、要するにこういうことがやりたい。

\newcommand{\Test}[1]{TEST[#1]}
\begin{defqverb}\Sample\Test{#%$%#}\end{defqverb}
\show\Sample %=> TEST[#%$%#]

〈内容〉に相当するトークン列は「\Test{1#12%12$12%12#12}2」であり、\Test は制御綴と認識されるので、それを完全展開した結果は「TEST[#%$%#]」となる必要がある。

方針

これを実現する方法として、マクロ \defqverb\enddefqverb を次のように定義することを考える。

  • \defqverb#1 → 〔カテゴリコードの変更の処理〕\xdef#1{
  • \enddefqverb}

つまり、この要件では、\xdef による定義((環境の実装コードは局所化された状態で実行されるので、仮にグローバルな定義を用いている。本当は \制御綴 への代入がグローバルになるのは要件と合わないが、その対策は後で考える。))なので、単純に \begin{defqverb}\end{defqverb} を展開させることで所望の \xdef の文を作り出せる可能性がある。(非展開の \(g)def の場合は、そもそも〈内容〉の直後にある \end{defqverb} を展開させることが不可能である。)((ちなみに、通常の verbatim 処理の環境のように「\end{defqverb} を終端にした区切り付マクロで内容を拾い上げる」という方法は、「カテゴリコード 1/2 の {} を区切りにする」ことができないので、今の要件では利用しづらい。))

これを実装しようとすると、前回と同様に、対応の取れない波括弧を(\defqverb の)マクロ定義に含めるという問題に直面する。しかも、前回の要件と異なり、ここではマクロ定義文を作る必要があるので、{ の代わりに \bgroup を使うことができない。この実装方針は使えないのであろうか。

(まだ続く)