%E8%A1%A8%E5%85%A7%E7%9A%84%E7%B7%A9%E8%A1%9D%E5%8D%80.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