%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E5%86%85%E3%81%AE%E3%83%90%E3%83%83%E3%83%95%E3%82%A1.png)
\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
表示される行にコールバックを登録すると、それが実行されるのは次の行につまり、同じ行にある他のすべては、\startbuffer
TeX によって通常どおり処理および展開されます。この\stopbuffer
コマンドは、コールバックがスキャンを停止するタイミングを知るためのマーカーとしてのみ使用され、その後破棄されるため、実際には定義されていませんが、ここでは通常の TeX 入力として表示され、定義されていないため、表示されている未定義の制御シーケンス エラーが発生します。
あなたは、何かよく分からない馬鹿げた理由で、持っているこれを実現するために、他のケースでは確実に失敗する貧弱な回避策があります。バッファは、やりたいことを実行するのに間違った方法だと私は強く信じていますが、XY問題(繰り返しそうしないように言われていますが)私にできることはもう何もありません。
本当の解決策はマクロではバッファを使用しない引数としても、置換テキストとしても使用できません。
\starttext
\def\test#1\endtest{#1}
\test
\ctxlua{buffers.assign(
"mytest",
"\luaescapestring{\normalunexpanded{\input knuth }}")}%
\endtest
\getbuffer[mytest]
\stoptext