Я перевожу еженедельную раздачу моей церкви в 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
Ганс написал мне по электронной почте. Существует высокоуровневый интерфейс для повторения страниц, и он гораздо проще в использовании, чем я думал. Сложности возникают только тогда, когда желаемое количество повторений несоизмеримо с размерами страницы.
\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}%
Однако этого недостаточно, поскольку поле shipout очищается после отправки страницы. Это делается в обработчике страницы. Если вы используете метод arring, обработчик — \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