\shipout について

\shipout について

パッケージについて読んでいると、特定のイベントにマクロを適用しようとしていたところ、このコマンドを見つけました\shipout。インターネットで検索してもあまり役に立ちませんでしたが、間違っていなければ、これは何らかの形で新しいページの作成に関連しています (そうでしょうか?)。

私の質問は、 とは正確には何なのか\shipout、それは何をするのか、そしてそれがどのようにそれを実行するのかということです。(つまり、バックグラウンドの低レベルで何が起こっているのか)

答え1

これは非常に簡単です:\shipoutはプリミティブです。その構文は

\shipout ⟨box⟩

ここで、⟨box⟩はTeXbookの278ページで完全に指定されています。

⟨ボックス⟩ → \box⟨8 ビットの数値⟩ | \copy⟨8 ビットの数値⟩
  | \lastbox| \vsplit⟨8 ビットの数値⟩ to⟨寸法⟩
  | \hbox⟨ボックス仕様⟩ {⟨水平モードの材質⟩ }
  | \vbox⟨ボックス仕様⟩ ⟨垂直モードの材質⟩   | ⟨{ボックス仕様⟩ ⟨垂直モードの材質⟩ ⟨ボックス仕様⟩ → ⟨寸法⟩⟨フィラー⟩ | ⟨寸法⟩⟨フィラー⟩ | ⟨フィラー⟩}
\vtop{}
tospread

例えば、

\shipout\hbox{Hello world}

そして、DVIまたはPDFファイルに1ページが作成されます。もちろん、誰も\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。たとえば、同じ物理ページに 2 つの出力ページを配置するように設定したり、16 ページの折丁 (パッケージ名の由来) を作成したりするように設定したりできます。

パッケージも同様に行います。の呼び出しと実際のページ送信の間をフックできるようにatbegshi再定義します。\shipout\shipout

プリミティブが正確に行うことは\shipout、入力された垂直リストを低レベルの印刷命令 (または が使用されている\pdfoutput場合はの値に応じて DVI または PDF 形式、が使用されている場合は XDV、Knuth TeX の場合は DVI のみ) に変換することです。その間、すべての遅延操作が実行され、トークンが拡張されます。このようにして、ページ番号への参照は、ページが送信されるときに計算されるため、正しいことが保証されます。pdftexluatexxetex\write

答え2

からテキストブック第23章「出力ルーチン」、254ページ:

TeX の基本コマンド\shipout<box> は、実際に出力を行うコマンドです。このコマンドは、ボックスの内容をdviファイル (TeX のメイン出力ファイル) に送信します。TeX が終了すると、dviファイルには、印刷する内容を正確に指定する、デバイスに依存しないコンパクトな命令のエンコードが含まれます。ボックスが送信されると、TeX は、第 15 章で説明したように、ターミナルに\count0からの値を表示します。これらの 10 個のカウンタもファイルに記録され、ページを識別するために使用できます。ボックス内に出現する、、コマンドはすべて、ボックスが送信されるときに自然な順序で実行されます。第21 章で説明したように、 コマンドはマクロを展開するため、TeX のスキャン メカニズムは、 の実行中に構文エラーを検出することがあります。の時点で がゼロでない場合、送信されるボックスの内容がログ ファイルにシンボリック形式で書き込まれます。 は、出力ルーチン内だけでなく、どこでも使用できます。\count9dvi\openout\closeout\write\write\shipout\tracingoutput\shipout\shipout

関連情報