%D0%A2%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D1%8B.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
TL;DRТак делать нельзя. Поставьте буфер за пределы стола.
Причина в том, что \bTD...\eTD
считывает содержимое между ними как аргумент. Вы можете легко воспроизвести ту же ошибку с помощью этого:
\starttext
\def\test#1\endtest{#1}
\test
\startbuffer[mytest]
\input knuth
\stopbuffer[mytest]
\endtest
\stoptext
Фактическая проблема заключается в том, что при чтении содержимого в качестве аргумента фиксируются каткоды, в частности, окончания строк преобразуются в пробелы, что приводит к
\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