0 голосов
500 просмотров

Я пытаюсь использовать хуки для установки нескольких рамок в документе. Я могу установить первую и отключить рамки, но если я пытаюсь установить вторую, она просто возвращается к первой.

\sethook{before}{mt1}{\def\PageBorder{path_to_border_1}}
\sethook{before}{imt1}{\def\PageBorder{}}
\sethook{before}{c}{\def\PageBorder{path_to_border_2}}

Что я делаю не так? Возможно ли это?

Переведено машиной с языка English
PTXprint от (1,9тыс. очков) | 500 просмотров

5 Ответов

0 голосов

Эксперты по XeTeX, вероятно, смогут дать вам более точный ответ, но несколько лет назад мы работали над проектом, где нам нужна была определенная рамка для первой страницы книги, но другая рамка для второй и последующих страниц. Мы достигли этого, переопределив макрос pl@ceborder (один из тех макросов, которые обычно не переопределяют…), используя определение PageBorder{} и новый макрос под названием PageBorderTwo{}. В коде ниже есть несколько комментариев, которые могут помочь вам понять, как это работает. Вы также можете просто попробовать это на тестовом проекте…

Джефф

% Define this to add a border to all pages, from a PDF file containing the graphic
%   "scaled <factor>" adjusts the size (1000 would keep the border at its original size)
% Can also use "xscaled 850 yscaled 950" to scale separately in each direction,
%   or "width 5.5in height 8in" to scale to a known size
%\def\PageBorder{"A5 page border.pdf" width 148.5mm height 210mm}
\def\PageBorder{}
% If \PageBorderTwo is defined, then shift to a different page border after
% the first page. This needs to be redefined after each \ptxfile, as it gets cleared out
\def\PageBorderTwo{}

%% Redefine the ptx2pdf macro which places the border, so that we can
%% shift to a different border after the first page, if \PageBorderTwo is defined
\catcode`\@=11   % allow @ to be used in the name of ptx2pdf macro we have to override
\def\pl@ceborder{\ifx\PageBorder\empty\else
  \setbox\b@rder=\hbox{\XeTeXpdffile \PageBorder \relax}%
  \setbox\b@rder=\vbox to \pdfpageheight{\vss
    \hbox to \pdfpagewidth{\hss\box\b@rder\hss}\vss}%
  \vbox to 0pt{% respect binding gutter, just like main page content
    \hbox to \pdfpagewidth{\hss\hbox{%
      \if\g@tterside L\kern\BindingGutter\fi
      \box\b@rder
      \if\g@tterside R\kern\BindingGutter\fi
    }\hss}
  \vss}% output \box\b@rder
  \ifx\PageBorderTwo\empty\else % we have a diff page 2 border, so shift to it
    \global\let\PageBorder=\PageBorderTwo
    \global\def\PageBorderTwo{} % clear page 2 border, so we don't have to set border box each time
  \fi
\fi}
\catcode`\@=12   % return to normal function
Переведено машиной с языка English
от (1,4тыс. очков)

Спасибо. Ваш код позволил мне получить работающее решение, хотя мой хак кажется мне довольно уродливым.

Моя цель состояла в том, чтобы на нескольких страницах не было рамки. Чтобы ваш код заработал, я изменил свою третью строку на:

\sethook{before}{c}{\def\PageBorder{path_to_border_2}\def\PageBorderTwo{path_to_border_2}}

Мне пришлось сделать это, потому что, когда я включал вторую рамку, она печатала одну страницу с первой рамкой, прежде чем переключиться. Что в коде говорит «напечатать одну страницу с рамкой 1, а затем переключиться на рамку 2»?

В любом случае, на этом этапе я перехожу от «это работает» к «я хочу лучше понять xetex/pdf2ptx».

Переведено машиной с языка English
0 голосов

Код определяет рамку, а затем в части, начинающейся со:

\ifx\PageBorderTwo\empty\else

Он проверяет, задан ли PageBorderTwo, и если да, изменяет PageBorder. Как дано, код Джеффа выглядит так, будто он перезагружает PDF-файл рамки на каждой странице, поэтому изменение PageBorder вступает в силу в следующий раз, когда нужно напечатать рамку. Если PageBorderTwo пуст, то PageBorder останется прежним.

Если вы не используете версию кода Джеффа, а придерживаетесь оригинала, который перезагружает PDF только тогда, когда коробка пуста (например, в начале документа), мы можем использовать это с триггерами и устанавливать коробку пустой (void) всякий раз, когда хотим изменить рамку.
Если вы хотите изменить рамку в разных местах кода, вы можете сделать что-то вроде этого:

\makeatletter
\setcvhook{GEN1.1}{\def\PageBorder{path_to_border2}\setbox\b@rder\box\voidb@x}
\sethook{bookstart}{MAT}{\let\PageBorder\empty\setbox\b@rder\box\voidb@x} % No border for NT intro
\setcvhook{MAT1.1}{\def\PageBorder{path_to_border3}\setbox\b@rder\box\voidb@x}
\makeatother

Весь код абсолютно не протестирован!
(\voidb@x — это просто обычная коробка, но никто никогда не должен класть в нее ничего, поэтому она всегда пуста)

Переведено машиной с языка English
от (1,1тыс. очков)

Расширяя ответ DavidG, причина использования \setbox\b@rder\box\voidb@x в том, что макросы кэшируют PDF-файл рамки в box\b@rder. Следовательно, изменение имени файла не имеет эффекта, если вы также не очистите кэшированную коробку рамки, заставив макросы перезагрузить файл в следующий раз при выводе страницы.

Переведено машиной с языка English
0 голосов

Спасибо за ответы. Это помогает мне гораздо лучше понять.

Я почти добрался до того, чего хотел. На данный момент я думаю, что моя проблема не в коде для включения, отключения или переключения рамок. Скорее, похоже, что мои хуки работают в основном тексте, но не в переднем материале, который я написал внутри PTXprint. Это имеет смысл?

Я отправил архив на случай, если это поможет вам увидеть, что я делаю не так.

Переведено машиной с языка English
от (1,9тыс. очков)
0 голосов

Проблема в том, что изменения вносятся в некотором локальном окружении, поэтому они не имеют глобального эффекта

\sethook{before}{is2}{\global\let\PageBorder\empty\global\setbox\b@rder\box\voidb@x}

(Вы также можете использовать \sethook{page}{2}, на случай, если sfm когда-нибудь изменится, но вам всегда нужно использовать \global для настроек из хуков страниц, если вы хотите, чтобы они сохранялись. К слову, именно так я и пришел к решению — изменил хук на page2, осознал, что там не было \global, это сработало, и попробовал \global для вашей исходной точки хука)

Переведено машиной с языка English
от (1,1тыс. очков)

Превосходно! Это сработало идеально.

И знание о {page}{2} очень полезно. Я на самом деле думал, что такой хук был бы полезен, но посмотрел в слайд-шоу с семинара и не увидел ничего, что ссылалось бы на номера страниц. Было бы здорово, если бы эту функциональность где-то описали (или сказали мне, где она уже описана). Я посмотрел в техническом справочнике, но не смог найти.

Правка: Когда я просмотрел остальную часть своего документа, я осознал, что хук для страницы 2 сработал во второй раз, так как я перезапустил нумерацию страниц, когда дошел до основного текста, — так что это один из возможных недостатков использования нумерации страниц.

Переведено машиной с языка English
0 голосов

Это находится в правой части нижней половины страницы 3 презентации по хукам, «Хуки книг и страниц», в правом нижнем углу. Очевидно, да?
Я добавлю это в технический справочник!

Переведено машиной с языка English
от (1,1тыс. очков)

И правда, вот оно. Это не очевидно, когда я просто читаю вниз по левой стороне страницы и не смотрю в другие места :frowning:

Переведено машиной с языка English
Можете ли вы предоставить ссылку на презентацию по хукам? С момента этого поста в документации было внесено ряд изменений, и я не смог найти эту информацию в Master Slides или в каких-либо других продвинутых презентациях, найденных здесь: https://software.sil.org/ptxprint/documentation/
Переведено машиной с языка English
Презентация по хукам была частью семинара по продвинутому использованию (Karimu) в ноябре/декабре 2022 года. Несколько других презентаций с того семинара также не попали в MASTER, вероятно, потому что они слишком TeX-специфичны. Я спрашиваю MP, хочет ли он, чтобы я объединил их с MASTER, поместил их в нечто вроде файла MASTER, адаптировал их для более общего использования или просто поделился ссылкой на них как есть.
Насколько мне известно, папка с презентациями не была сделана общедоступной и была доступна только участникам. Я не уверен, что мотивировало это решение.
Переведено машиной с языка English

Похожие вопросы

0 голосов
1 ответ 18 просмотров
Здравствуйте, Я пытаюсь применить рамку страницы в PTXprint, но без включения страниц введения. Когда я включаю рамку в ... вместо \setcvhook для этого? Большое спасибо за помощь!
Roger Beramgoto Nado 125 задал вопрос мар 25
0 голосов
1 ответ 89 просмотров
Здравствуйте Я работаю над макетом и хотел ограничить границы страниц до 24-й главы, стиха 10, как показано на ... правила, которое я использовал. Заранее благодарю за помощь.
Roger Beramgoto Nado 125 задал вопрос дек 13, 2024
0 голосов
4 ответов 336 просмотров
Я хотел бы, чтобы рамка страницы была вокруг текста Писания, но не вокруг вступлений. В прошлом я использовал ... но не вокруг текста, созданного человеком (например, вступлений).
jeffh 1,4тыс. задал вопрос апр 8, 2024
0 голосов
1 ответ 155 просмотров
(Мне кажется, я помню обсуждение на эту тему, но сейчас не могу его найти ) В PDF, который я создаю с ... указать PTXprint, чтобы он не ставил рамку вокруг страниц книги GLO?
jeffh 1,4тыс. задал вопрос май 10, 2021
0 голосов
2 ответов 201 просмотров
Я хотел бы напечатать несколько книг ( 5 Т и Флм). 1Тс заканчивается 5 строками вверху страницы 5, но 2Тс ... пространства. Возможно ли это в PTXPrint? Спасибо за любую помощь.
Paul 642 задал вопрос июн 2, 2021
Welcome to Support Bible, where you can ask questions and receive answers from other members of the community.
And I tell you that you are Peter, and on this rock I will build my church, and the gates of Hades will not overcome it.
Matthew 16:18
3,045 вопросов
6,005 ответов
5,671 комментариев
2,026 пользователей