
다음을 허용하는 패키지에 대해 읽는 동안훅특정 이벤트에 대한 매크로를 사용하는 중에 이 명령을 발견했습니다 \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만)으로 변환하는 것입니다. 그 사이에 모든 지연된 작업을 실행하고 토큰을 확장합니다. 이러한 방식으로 페이지 번호에 대한 참조는 페이지가 배송될 때 계산되기 때문에 올바른 것으로 보장됩니다.\pdfoutput
pdftex
luatex
xetex
\write
답변2
에서TeXbook, 23장: 출력 루틴, 254페이지:
TeX의 기본 명령인
\shipout
<box>는 실제로 출력을 발생시키는 것입니다. 이것은 상자의 내용을dvi
TeX의 주요 출력 파일인 파일로 보냅니다. TeX가 완료된 후dvi
파일에는 인쇄할 내용을 정확하게 지정하는 장치 독립적인 압축 명령어 인코딩이 포함됩니다. 상자가 배송되면 TeX는 15장에서 설명한 대로 터미널에\count0
through 값을 표시합니다.\count9
이 10개의 카운터도 파일에 기록되어dvi
페이지를 식별하는 데 사용할 수 있습니다. 상자 내부에 나타나는 모든\openout
,\closeout
및\write
명령은 해당 상자가 배송되는 자연스러운 순서대로 수행됩니다. 21장에서 설명했듯이 명령은\write
매크로를 확장하므로 TeX의 검색 메커니즘은 a가\shipout
진행되는 동안 구문 오류를 감지할 수 있습니다.\tracingoutput
의 시점에 가 0이 아닌 경우\shipout
배송 중인 상자의 내용물이 기호 형식으로 로그 파일에 기록됩니다.\shipout
출력 루틴뿐만 아니라 어디에서나 말할 수 있습니다 .