\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