ConTeXt 組版は各ページを繰り返す

ConTeXt 組版は各ページを繰り返す

私は教会の毎週の配布物を Context に変換しています。フォーマットは 8.5x11 ページの半分で、表と裏に印刷されています。

必要なのは、ConTeXt 面付け 2SIDE スキーマと同等のものですが、半ページが 1 回繰り返されるため、次のようになります...

Printed Page 1 === Half Page 1, Half Page 1
Printed Page 2 === Half Page 2, Half Page 2

最初のファイルをコンパイルしてから、結果の PDF を面付けして再配置することはできると思いますが、扱いにくいようです。可能であれば、1 つのコンテキスト ファイルで実行したいです。

答え1

Hans からメールが届きました。ページを繰り返すための高水準のインターフェースがあり、思ったよりずっと簡単に使えます。繰り返し回数がページのサイズに見合わない場合にのみ難しくなります。

\setuppapersize[A5][A4,landscape]
\setuplayout[nx=2]

\starttext
    \dorecurse{10}{\input knuth\relax}
\stoptext

ここに画像の説明を入力してください

参考用の古いソリューション

これはそれほど簡単ではありません。高レベルのインターフェースが存在しないからです(メーリングリストのスレッドかなり前のことですが、これを機能させるには、shipout ルーチンを詳しく調べる必要があります。まず最初に、ページ shipout を複製する必要があります。これは、\page_boxes_shipout次の 2 行で実行されます。

\finalizeshipoutbox\shipoutscratchbox
\page_shipouts_handle{\box\shipoutscratchbox}%

しかし、これは十分ではありません。ページを出荷した後に出荷ボックスがクリアされるからです。これはページハンドラーで行われます。配置方法を使用する場合、ハンドラーは です\page_shipouts_arrange。問題はこれらの行にあります。

\setbox\scratchbox\hpack
     {\page_otr_flush_every_stuff
      \page_otr_flush_special_content
      \box\shipoutscratchbox}%

コマンドは\box\shipoutscratchboxタイプセット後にボックスをクリアするので、 に置き換えます\copy\shipoutscratchbox

完全な例は次のとおりです。

\setuppapersize[A5][A4,landscape]
\setuparranging[2SIDE]

\unprotect

%
% from page_imp.mkiv
%

\def\page_boxes_shipout#1% or: \page_shipouts_apply
  {\dontcomplain         % redundant
   \ifcase\c_page_boxes_flush_n\else
     \page_boxes_flush_before
   \fi
   \the\everybeforeshipout
   \ifcase\shipoutfinalizemethod
     \page_shipouts_handle{#1}%
   \else
     \setbox\shipoutscratchbox\hpack{#1}% just in case there are objects there, hook for testing (will go away)
     \finalizeshipoutbox\shipoutscratchbox
     \page_shipouts_handle{\box\shipoutscratchbox}%
     % Duplicate the shipout
     \finalizeshipoutbox\shipoutscratchbox
     \page_shipouts_handle{\box\shipoutscratchbox}%
   \fi
   \setnextrealpageno       % so this comes before \everyaftershipout so in fact:
   \the\everyaftershipout   % at this point we're already on the next realpage
   \ifcase\c_page_boxes_flush_n\else
     \page_boxes_flush_after
   \fi}

\def\page_shipouts_arrange#1%
  {% \global\advance\shippedoutpages\plusone
   \begingroup
   \setbox\scratchbox\hpack
     {\page_otr_flush_every_stuff
      \page_otr_flush_special_content
      \copy\shipoutscratchbox}% \copy instead of \box
   \pusharrangedpage\scratchbox
   \deadcycles\zerocount
   \endgroup}

\protect

\starttext

\dorecurse{10}{\input knuth\relax}

\stoptext

出力の最初のページ:

ここに画像の説明を入力してください

答え2

ConTeXt は、完成したページを操作できる出力ルーチンのフックを提供します。これを使用して、各ページの内容を紙に 2 回配置できます。

\installshipoutmethod{REPEAT}
  {\dowithnextbox
     {\setbox\scratchbox\hpack to \paperwidth{\box\nextbox\hss}%
      \setbox\scratchbox\hpack               {\copy\scratchbox\box\scratchbox}%
      \invokepagehandler{normal}{\box\scratchbox}}
   \hpack}

\setuppapersize[A5][A4,landscape]

\setuppaper[method=REPEAT]

\starttext

\chapter{Knuth}

\input knuth

\chapter{Zapf}

\input zapf

\stoptext

紙にページ出力を繰り返す

関連情報