Tabela.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
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...\eTD
lê 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 \startbuffer
e \stopbuffer
devem aparecer em uma linha individual.
Mais fundo, \start...\stopbuffer
usa o process_input_buffer
callback para escanear o buffer, mas quando você registra o callback na linha onde \startbuffer
aparece, ele só entra em açãona próxima linha, ou seja, todo o resto na mesma linha \startbuffer
ainda é normalmente processado e expandido pelo TeX. O \stopbuffer
comando 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