Búfer dentro de la tabla (b)

Búfer dentro de la tabla (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

¿Por qué sucede esto y cómo lo soluciono?

Respuesta1

TL;DRNo puedes hacerlo. Coloque el búfer fuera de la mesa.


La razón es que \bTD...\eTDlee el contenido intermedio como un argumento. Puedes reproducir fácilmente el mismo error con esto:

\starttext
\def\test#1\endtest{#1}
\test
    \startbuffer[mytest]
    \input knuth
    \stopbuffer[mytest]
\endtest
\stoptext

El problema real es que al leer el contenido como argumento, los catcodes se corrigen, en particular, los finales de línea se convierten en espacios, lo que resulta en

\test \startbuffer[mytest] \input knuth \stopbuffer[mytest] \endtest

pero ambos \startbuffery \stopbuffertienen que aparecer en una línea individual.

Más profundamente, \start...\stopbufferusa la process_input_bufferdevolución de llamada para escanear el búfer, pero cuando registra la devolución de llamada en la línea donde \startbufferaparece, solo se activaráen la siguiente línea, es decir, todo lo demás en la misma línea que \startbuffernormalmente procesa y expande TeX. El \stopbuffercomando en realidad no está definido porque solo se usa como marcador para que la devolución de llamada sepa cuándo detener el escaneo y luego se descarta, pero como aparece aquí como una entrada TeX normal y no está definido, se obtiene el error de secuencia de control indefinida. estás viendo.


Ya que sigues insistiendo en que por alguna razón desconocida y ridículatenerPara hacer esto, he aquí una mala solución que seguramente fallará en otros casos. Creo firmemente que los buffers son la forma incorrecta de hacer lo que quieras, pero como sigues inventandoproblemas XY(cosa que le han pedido repetidamente que no haga) realmente no hay nada más que pueda hacer.

La verdadera solución esno usar buffers en macros. Ni como argumento, ni en el texto sustitutivo.

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

información relacionada