\shipout에 관한 모든 것

\shipout에 관한 모든 것

다음을 허용하는 패키지에 대해 읽는 동안특정 이벤트에 대한 매크로를 사용하는 중에 이 명령을 발견했습니다 \shipout. 인터넷에서 검색하는 것은 많은 도움이 되지 않았지만 제가 크게 틀리지 않았다면 그것은 새 페이지를 만드는 것과 어느 정도 관련이 있습니다(또는 그렇습니까?).

내 질문은 정확히 무엇이며 \shipout, 무엇을 하며, 어떻게 수행하는가입니다. (즉, 백그라운드의 낮은 수준에서 무슨 일이 일어나고 있는지)

답변1

이것은 매우 쉽습니다: \shipout기본입니다. 구문은 다음과 같습니다.

\배출 ⟨상자⟩

여기서 ⟨box⟩는 TeXbook의 278페이지에 완전히 지정되어 있습니다.

⟨상자⟩ → \box⟨8비트 숫자⟩ | \copy⟨8비트 숫자⟩
  | \lastbox| \vsplit⟨8비트 숫자⟩ to⟨dimen⟩
  | \hbox⟨박스 사양⟩ {⟨가로 모드 소재⟩ }
  | \vbox⟨박스 사양⟩ {⟨세로 모드 소재⟩ }
  | \vtop⟨박스 사양⟩ {⟨세로 모드 소재⟩ }
⟨박스 사양⟩ → to⟨dimen⟩⟨filler⟩ | spread⟨치수⟩⟨필러⟩ | ⟨필러⟩

예를 들어 다음과 같이 말할 수 있습니다.

\shipout\hbox{Hello world}

DVI 또는 PDF 파일의 한 페이지가 생성됩니다. 물론 아무도 \shipout이런 식으로 사용하고 싶어하지 않습니다. 주요 사용법은 TeX가 전체 페이지를 배출하기에 충분한 자료가 있다고 결정할 때 호출되는 출력 루틴에 있습니다. 현재 기본 수직 목록은 선택한 페이지 나누기에서 분할되고 해당 내용은 \box255출력 루틴이 작동할 수 있는 로 패키징됩니다 . 예를 들어, Plain TeX 출력 루틴은 다음을 수행합니다.

\shipout\vbox{
  \makeheadline
  \pagebody
  \makefootline
}
\advancepageno
\ifnum\outputpenalty>-\@MM
\else
  \dosupereject
\fi

따라서 머리글과 바닥글로 장식된 전체 페이지가 배송됩니다. 의 내용은 \box255에 의해 마사지됩니다 \pagebody. LaTeX의 출력 루틴은 훨씬 더 복잡합니다.

우리가 할 수 있는 일은 \shipout다른 일을 하도록 재정의하는 것입니다. 이와 같은 작업을 수행한 가장 오래된 매크로 세트는 quire.tex(CTAN 및 TeX Live에서 여전히 사용 가능)

\def\q_init
   {\global\q_sheetnr=0\global\q_qnr=0
    \global\let\q_oldship=\shipout
    \global\let\shipout=\q_boat
    \xdef\q_cycles{\the\deadcycles}%
    \global\let\endquire=\q_endquire
   }

\shipout명령에서 의 기본 의미를 저장하고 \q_oldship(매크로는 _'비공개' 마커로 사용) 로 재정의하여 \q_boat일부 작업을 수행하고 결국 을 호출합니다 \q_oldship. 예를 들어 동일한 실제 페이지에 두 개의 출력 페이지를 배치하거나 16개의 페이지 쿼리(패키지 이름)를 생성하도록 설정할 수 있습니다.

패키지도 atbegshi비슷합니다. \shipout호출 \shipout과 실제 페이지 발송 사이에 연결될 수 있도록 재정의합니다 .

프리미티브가 정확히 수행하는 작업은 공급되는 수직 목록을 낮은 수준의 인쇄 명령( 또는 사용되는 경우 \shipout의 값에 따라 DVI 또는 PDF 형식, 사용되는 경우 XDV, Knuth TeX의 경우 DVI만)으로 변환하는 것입니다. 그 사이에 모든 지연된 작업을 실행하고 토큰을 확장합니다. 이러한 방식으로 페이지 번호에 대한 참조는 페이지가 배송될 때 계산되기 때문에 올바른 것으로 보장됩니다.\pdfoutputpdftexluatexxetex\write

답변2

에서TeXbook, 23장: 출력 루틴, 254페이지:

TeX의 기본 명령인 \shipout<box>는 실제로 출력을 발생시키는 것입니다. 이것은 상자의 내용을 dviTeX의 주요 출력 파일인 파일로 보냅니다. TeX가 완료된 후 dvi파일에는 인쇄할 내용을 정확하게 지정하는 장치 독립적인 압축 명령어 인코딩이 포함됩니다. 상자가 배송되면 TeX는 15장에서 설명한 대로 터미널에 \count0through 값을 표시합니다. \count9이 10개의 카운터도 파일에 기록되어 dvi페이지를 식별하는 데 사용할 수 있습니다. 상자 내부에 나타나는 모든 \openout, \closeout\write명령은 해당 상자가 배송되는 자연스러운 순서대로 수행됩니다. 21장에서 설명했듯이 명령은 \write매크로를 확장하므로 TeX의 검색 메커니즘은 a가 \shipout진행되는 동안 구문 오류를 감지할 수 있습니다. \tracingoutput의 시점에 가 0이 아닌 경우 \shipout배송 중인 상자의 내용물이 기호 형식으로 로그 파일에 기록됩니다. \shipout출력 루틴뿐만 아니라 어디에서나 말할 수 있습니다 .

관련 정보