Buffer dentro da (b)Tabela

Buffer dentro da (b)Tabela
\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 que isso está acontecendo e como resolvo isso?

Responder1

DRVocê não pode fazer isso. Coloque o buffer fora da mesa.


A razão é que \bTD...\eTDlê o conteúdo intermediário como um argumento. Você pode reproduzir facilmente o mesmo erro com isto:

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

O problema real é que ao ler o conteúdo como um argumento, os catcodes estão sendo corrigidos, em particular, os finais de linha são convertidos em espaços, o que resulta em

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

mas ambos \startbuffere \stopbufferdevem aparecer em uma linha individual.

Mais fundo, \start...\stopbufferusa o process_input_buffercallback para escanear o buffer, mas quando você registra o callback na linha onde \startbufferaparece, ele só entra em açãona próxima linha, ou seja, todo o resto na mesma linha \startbufferainda é normalmente processado e expandido pelo TeX. O \stopbuffercomando não está realmente definido porque é usado apenas como um marcador para o retorno de chamada saber quando parar a varredura e é então descartado, mas como aparece como uma entrada normal do TeX aqui e não está definido, você obtém o erro de sequência de controle indefinida você está vendo.


Já que você continua insistindo que por algum motivo desconhecido e ridículo vocêterpara fazer isso, aqui está uma solução alternativa ruim que certamente falhará em outros casos. Eu acredito fortemente que os buffers são a maneira errada de fazer o que você quer, mas como você continua inventandoProblemas XY(o que lhe foi repetidamente solicitado a não fazer), não há realmente mais nada que eu possa fazer.

A verdadeira solução énão use buffers em macros. Nem como argumento, nem no texto de substituição.

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

informação relacionada