前回は、環境の中身が「\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
を使うことができない。この実装方針は使えないのであろうか。