Повтор наложения 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

Ганс написал мне по электронной почте. Существует высокоуровневый интерфейс для повторения страниц, и он гораздо проще в использовании, чем я думал. Сложности возникают только тогда, когда желаемое количество повторений несоизмеримо с размерами страницы.

\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

Повторный вывод страницы на бумагу

Связанный контент