(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

실제 문제는 내용을 인수로 읽어서 catcode가 수정된다는 것입니다. 특히 줄 끝이 공백으로 변환되어 다음과 같은 결과가 발생합니다.

\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

관련 정보