Буфер внутри (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

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

Связанный контент