(b)Table 内的缓冲区

(b)Table 内的缓冲区
\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

实际的问题是,通过将内容作为参数读取,catcode 被修复,特别是行尾被转换为空格,这导致

\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

相关内容