ConTeXt 拼版重复每页

ConTeXt 拼版重复每页

我正在将我教堂的每周讲义转换为 Context。格式为半张 8.5x11 页,正面和背面均打印。

我需要的是与 ConTeXt 拼版 2SIDE 模式相当的模式,只是半页重复一次,这样......

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

我知道我可能可以编译第一个文件,然后使用拼版重新排列生成的 PDF,但这似乎不太方便。如果可能的话,我更愿意在一个 Context 文件中完成此操作。

答案1

Hans 给我发了一封电子邮件。有一个用于重复页面的高级界面,使用起来比我想象的要容易得多。只有当你想要的重复次数与页面尺寸不相称时,它才会变得困难。

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

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

在此处输入图片描述

旧解决方案供参考

这并不容易,因为没有高级接口来实现这一点(有一个邮件列表中的帖子很久以前)。您必须深入研究 shipout 例程才能使其工作。您要做的第一件事是复制页面 shipout。这在\page_boxes_shipout以下两行中完成:

\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 为输出例程提供了一个钩子,让您可以操纵完成的页面。您可以使用它将每页的内容两次放在您的纸上。

\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

在纸上重复页面输出

相关内容