(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出現的行上註冊回調時,它只會啟動在下一行,即同一行上的所有其他內容\startbuffer仍然由 TeX 正常處理和擴展。該\stopbuffer命令實際上並未定義,因為它僅用作回調的標記,以了解何時停止掃描,然後被丟棄,但因為它在此處顯示為常規TeX 輸入且未定義,因此您會收到未定義的控制序列錯誤你正在看到。


既然你一直堅持認為出於某種未知的、可笑的原因你為此,這裡有一個糟糕的解決方法,在其他情況下肯定會失敗。我堅信緩衝區是做任何你想做的事情的錯誤方法,但因為你不斷彌補XY 問題(您已多次被要求不要這樣做)我真的無能為力。

真正的解決方法是不在巨集中使用緩衝區。既不作為參數,也不在替換文字中。

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

相關內容