Puffer innerhalb (b)Tabelle

Puffer innerhalb (b)Tabelle
\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

Warum passiert das und wie kann ich das Problem lösen?

Antwort1

Kurz zusammengefasstDas geht nicht. Platzieren Sie den Puffer außerhalb der Tabelle.


Der Grund ist, dass \bTD...\eTDder Inhalt dazwischen als Argument gelesen wird. Sie können den gleichen Fehler problemlos hiermit reproduzieren:

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

Das eigentliche Problem ist, dass durch das Lesen des Inhalts als Argument die Catcodes korrigiert werden, insbesondere werden Zeilenenden in Leerzeichen umgewandelt, was zu

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

Aber sowohl als auch \startbuffermüssen \stopbufferin einer eigenen Zeile stehen.

Weiter unten \start...\stopbufferwird der process_input_bufferCallback verwendet, um den Puffer zu scannen, aber wenn Sie den Callback in der Zeile registrieren, in der \startbuffererscheint, wird er nur aktiviertin der nächsten Zeile, also alles andere in derselben Zeile, das \startbuffernoch immer normal von TeX verarbeitet und erweitert wird. Der \stopbufferBefehl ist eigentlich nicht definiert, da er nur als Markierung für den Rückruf verwendet wird, um zu wissen, wann das Scannen beendet werden soll, und dann verworfen wird, aber da er hier als reguläre TeX-Eingabe erscheint und nicht definiert ist, erhalten Sie den angezeigten Fehler „undefinierte Steuersequenz“.


Da Sie immer wieder behaupten, dass Sie aus irgendeinem unbekannten, lächerlichen GrundhabenUm dies zu tun, ist hier ein schlechter Workaround, der in anderen Fällen garantiert fehlschlägt. Ich bin fest davon überzeugt, dass Puffer der falsche Weg sind, um das zu tun, was Sie tun möchten, aber da Sie immer wiederXY-Probleme(was Sie wiederholt gebeten wurden, nicht zu tun) kann ich wirklich nichts weiter tun.

Die wirkliche Lösung besteht darin,keine Puffer in Makros verwenden. Weder als Argument, noch im Ersetzungstext.

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

verwandte Informationen