(b)テーブル内のバッファ

(b)テーブル内のバッファ
\starttext
\bTABLE
\bTR \bTD%
    \startbuffer[mytest]
    \input knuth
    \stopbuffer[mytest]
\eTD \eTR%
\eTABLE%
\stoptext
tex error    > tex error on line 10 in file ...tex: ! Undefined control sequence

なぜこのようなことが起こるのでしょうか、またどうすれば解決できるのでしょうか?

答え1

要約それはできません。バッファをテーブルの外側に置いてください。


その理由は、\bTD...\eTDその間の内容を引数として読み取るためです。次のようにすれば、同じエラーを簡単に再現できます。

\starttext
\def\test#1\endtest{#1}
\test
    \startbuffer[mytest]
    \input knuth
    \stopbuffer[mytest]
\endtest
\stoptext

実際の問題は、内容を引数として読み込むことで、catcodesが修正され、特に行末がスペースに変換され、

\test \startbuffer[mytest] \input knuth \stopbuffer[mytest] \endtest

ただし\startbuffer、 と は両方とも\stopbuffer個別の行に表示する必要があります。

より深くでは、コールバック\start...\stopbufferを使用してprocess_input_bufferバッファをスキャンしますが、\startbuffer表示される行にコールバックを登録すると、それが実行されるのは次の行につまり、同じ行にある他のすべては、\startbufferTeX によって通常どおり処理および展開されます。この\stopbufferコマンドは、コールバックがスキャンを停止するタイミングを知るためのマーカーとしてのみ使用され、その後破棄されるため、実際には定義されていませんが、ここでは通常の TeX 入力として表示され、定義されていないため、表示されている未定義の制御シーケンス エラーが発生します。


あなたは、何かよく分からない馬鹿げた理由で、持っているこれを実現するために、他のケースでは確実に失敗する貧弱な回避策があります。バッファは、やりたいことを実行するのに間違った方法だと私は強く信じていますが、XY問題(繰り返しそうしないように言われていますが)私にできることはもう何もありません。

本当の解決策はマクロではバッファを使用しない引数としても、置換テキストとしても使用できません。

\starttext
\def\test#1\endtest{#1}
\test
    \ctxlua{buffers.assign(
        "mytest",
        "\luaescapestring{\normalunexpanded{\input knuth }}")}%
\endtest
\getbuffer[mytest]
\stoptext

関連情報