TeX의 입력/출력 기본 요소

TeX의 입력/출력 기본 요소

나는 상호 참조와 같은 것들을 처리하고 일반 TeX에서 사용하기 위한 몇 가지 간단한 매크로를 작성하고 싶습니다. (Eplain에 있는 것과 같이 이에 관련된 매크로가 이미 있다는 것을 알고 있지만 직접 다른 것을 시도하고 싶습니다.) 따라서 파일에서 읽는 방법과 파일에 쓰는 방법을 알아야 합니다. 이러한 작업을 수행하는 TeX 기본 요소는 무엇입니까? 어떻게 작동하나요?

또 다른 질문: TeX가 실행되는 동안 다른 프로그램을 '호출'할 수 있습니까? 내 말은: C 언어에 있는 시스템 기능과 동등한 기능이 TeX에 있습니까?

답변1

TeX에는 파일을 읽고 쓰는 데 필요한 기본 요소와 '여기'에 전체 파일을 입력하는 데 필요한 기본 요소가 \read있습니다 . 예를 들어 LaTeX 상호 참조 메커니즘을 사용 하지만 적절하게 설계된 보조 파일을 사용하기 위해 (라인 단위) 사용을 피합니다.\write\input\write\read\input

\input이해하기 쉽기 때문에 \read및 에 집중하겠습니다 \write. 이 두 가지 모두 숫자가 제공되지만 일반적으로 \new.... 예를 들어

\newread\myread
\openin\myread=myinput %

\newwrite\mywrite
\immediate\openout\mywrite=myoutput %

라는 읽기 \myread와 라는 쓰기를 설정합니다 \mywrite. TeX 페이지 빌더의 비동기 특성으로 인해 내가 : \immediate를 사용했다는 점에 유의 하세요 . 작업이 '올바른' 위치에서 발생하는지 \write확인해야 합니다 . \write(이에 대해서는 아래에서 자세히 설명합니다.)

예를 들어 두 개의 스트림이 열려 있으면 출력에 쓸 수 있습니다. 두 개의 쓰기를 수행하면 하나는 '지금'이고 다른 하나는 '지연'입니다.

\def\foo{a}
\immediate\write\mywrite{\foo}
\write\mywrite{\foo}
\def\foo{b}
Hello
\bye

결과는 myoutput.tex읽고 있다

a
b

\write\mywrite페이지가 배송될 때만 실행되는 Whatsit을 생성하기 때문입니다 . 예를 들어 작성해야 하는 내용에 출력 단계에서만 알려진 페이지 번호가 포함되어 있는 경우 유용합니다. 또한 다음 \write과 같이 작동합니다 . 또는 \edef를 사용하지 않는 한 모든 것이 확장됩니다 . 그러나 이 확장은 작업이 실제로 실행되는 순간에 수행되므로 지연된 을 사용할 때 매크로가 적절한 정의를 갖도록 해야 합니다 .\noexpandtoks\write\write

기본 요소는 \read한 번에 한 줄씩 읽고(중괄호가 일치하지 않는 한) 일반적인 TeX 방식으로 토큰화합니다. \ifeof에 대한 테스트를 사용하여 한 번에 한 줄씩 파일을 반복하도록 배열할 수 있지만 \myread, 제가 말했듯이 단순히 \input상호 참조가 포함된 파일을 간단히 작성하는 것이 더 쉬운 경우가 많습니다.

시스템 호출을 수행하려는 경우 '순수한' TeX는 실제로 도움이 되지 않습니다. 그러나 Web2c에는 오랫동안 시스템으로의 탈출을 허용하는 특별한 '스트림'이 있었습니다 \write18. 이는 보안 위험이므로 이러한 탈출에는 표준적으로 제한된 명령 세트만 허용됩니다. 예를 들어 할 수 있습니다

pdftex --shell-escape myfile

모든 탈출을 허용합니다. 모든 코드를 직접 작성했다면 위험은 엉망이 될 뿐입니다! a를 수행해 도 TeX에 아무 것도 피드백되지 않습니다. 아마도 보조 파일을 \write18사용하여 어떤 방식으로든 결과를 읽을 수 있도록 준비해야 합니다 .\read

주석에서 언급했듯이 사용 가능한 추가 구문 확장은 입니다 \input|"<command>". 이는 다시 제한되지만 \write18쉘 명령에서 입력을 가져오는 확장 가능한 방법을 제공합니다.

답변2

외부 파일을 통해 상호 참조를 처리할 때 또 다른 특별한 문제는 이 파일을 읽고, 열고, 쓰고, 닫는 순서입니다. 기본 계획은 다음과 같습니다.

\newwrite\fileout  % allocations of the file number

\def...     ... all macros which can be used in the file must be defined
\input file ... input only when file exists (the file doesn't exist at the first run)
            ... this input stores the data from file into internal macros
\immediate\openout\fileout=file  ... this removes the data from file
                                  ... the file has zero length now

... document ... macros used in the document write (typically not immediately) 
                 data to the file

\end ... this closes the file automatically, 
         but if you need to use the data from the file at the end of the document
         (for example the TOC at the end of the document):
\vfil\eject  
\immediate\closeout\fileout
\input file ... this creates the TOC at the end of the file.
\end

위의 구성표는 \input이 파일이 존재할 때만 파일을 읽는 매크로를 생성해야 함을 보여줍니다. \softinput이러한 목적으로 다음 매크로를 사용할 수 있습니다 .

\newread\testin
\def\softinput #1 {\let\next=\relax \openin\testin=#1
   \ifeof\testin \message{Warning: the file #1 does not exist}%
   \else \closein\testin \def\next{\input #1 }\fi
   \next}

관련 정보