0
500 次浏览

我正试图使用钩子(hooks)在文档中设置多重边框。我可以设置第一个边框,也可以关闭边框,但如果我尝试设置第二个边框,它又会变回第一个。

\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.9k 分) 发布 | 500 次浏览

5 个回答

0

XeTeX 的大神们可能能给你更好的答案,但几年前我们做过一个项目,希望书的第 1 页使用特定的边框,而第 2 页及后续页面使用不同的边框。我们通过重新定义宏 pl@ceborder(通常不建议重新定义的宏之一……),并使用 PageBorder{} 的定义以及一个新宏 PageBorderTwo{} 来实现的。下面的代码中有一些注释,可能有助于你理解其工作原理。你也可以在测试项目中直接尝试……

Jeff

% 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.4k 分) 发布

谢谢。你的代码让我得到了一个可用的方案,尽管我觉得我的这种变通方法(hack)相当丑陋。

我的本意是让几页没有边框。为了让你的代码生效,我将第三行改为:

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

我不得不这样做,因为当我开启第 2 个边框时,它在切换之前先打印了一页第 1 个边框。代码中是哪部分规定了“打印一页边框 1,然后切换到边框 2”?

总之,此时我正从“它能工作”转向“我想更好地理解 xetex/pdf2ptx”。

机器翻译自 English
0

该代码定义了边框框(border box),然后在以下部分开始:

\ifx\PageBorderTwo\empty\else

它检查 PageBorderTwo 是否已设置,如果是,则更改 PageBorder。就给出的代码而言,Jeff 的代码看起来像是在每一页都重新加载边框 PDF,因此更改 PageBorder 会在下一次需要写入边框时生效。如果 PageBorderTwo 为空,则 PageBorder 将保持原样。

如果你不使用 Jeff 版本的代码,而是坚持使用原始版本(该版本仅在框为空时,例如在文档开始时,才重新加载 PDF),我们可以利用触发器(triggers),并在想要更改边框时将框设为空(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.1k 分) 发布

补充 DavidG 的回答,使用 \setbox\b@rder\box\voidb@x 的原因是宏会在 box\b@rder 中缓存边框 PDF。因此,除非你也清除缓存的边框框以强制宏在下次输出页面时重新加载文件,否则更改文件名不会生效。

机器翻译自 English
0

感谢大家的回答。这让我对它的理解好多了。

我已经接近我想达到的目标了。此时我认为我的问题不在于开启、关闭或切换边框的代码。相反,似乎我的钩子在主文本中有效,但在我在 PTXprint 内部编写的前言部分无效。这说得通吗?

我已经发送了一个存档,希望能帮助你们看出我哪里做错了。

机器翻译自 English
(1.9k 分) 发布
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.1k 分) 发布

太棒了!完美解决了。

而且了解 {page}{2} 非常有帮助。我其实一直认为这样的钩子会有帮助,但查看了工作坊的幻灯片后,没有看到任何引用页码的内容。如果能在某处记录该功能(或告诉我它已经记录在哪里)就好了。我查了技术参考手册,但没找到。

编辑:当我浏览文档的其余部分时,我意识到第 2 页钩子被触发了第 2 次,因为当我到达主文本时重新开始了页码编号——所以这是使用页码编号的一个可能缺点。

机器翻译自 English
0

它在钩子演示文稿第 3 页下半部分的右侧,“书籍和页面钩子”(Book and Page hooks),右下角。很明显,对吧?
我会把它添加到技术参考中!

机器翻译自 English
(1.1k 分) 发布

果然,它就在那里。当我只是沿着页面左侧阅读而没有看其他地方时,它并不明显 :frowning:

机器翻译自 English
你能提供钩子演示文稿的链接吗?自该帖子以来,文档已经发生了一些变化,我没能从 Master Slides 或在此处找到的任何其他高级演示文稿中找到此信息:https://software.sil.org/ptxprint/documentation/
机器翻译自 English
钩子演示文稿是 2022 年 11 月/12 月(Karimu)高级使用工作坊的一部分。该工作坊的其他几个演示文稿也没有进入 MASTER 版本,可能是因为它们太偏向 TeX 了。我正在询问 MP 是否希望我将它们合并到 MASTER 中,放入类似 MASTER 文件的结构中,将其整理为更通用的用途,或者只是分享指向这里的链接。
据我所知,演示文稿文件夹并未公开,仅向参与者提供。我不确定是什么促使做出了那个决定。
机器翻译自 English

相关问题

0
1 个回答 18 次浏览
你好, 我试图在 PTXprint 中应用页面边框,但不包括引言页面 当我在 Tabs + Borders 中启用边框时,它会被应用到所有页面,包括引言 我希望的是: 引言页面没有边框 边框仅从经文文本开始(例如路加福音 1:1) ... 本开始应用边框,而不影响引言? 对于这种情况,是否应该使用不同于 \setcvhook 的方法? 非常感谢你的帮助!
Roger Beramgoto Nado 125 发布 提问于 三月 25
0
1 个回答 89 次浏览
你好 我正在制作一个版式,我希望将页面边框限制在第24章第10节,如截图所示。然而,在从 ptxprint-mode.text 设置规则后,它拒绝考虑新页面上剩余的文本行。这是正常的吗?有人能建议如何修复这个问题吗? 这是我使用的规则的截图。 提前感谢你的帮助。
Roger Beramgoto Nado 125 发布 提问于 十二月 13, 2024
0
4 个回答 336 次浏览
我希望在经文周围有页面边框,但在引言周围不要有 过去我使用过一些变通方法,包括(如果我只出版单卷书)将引言与扉页一起排版,并创建一个在正文之前加载的 PDF 过去我也在 TeX 宏中做过一些棘手(且丑陋)的操作,在幕后切换不同的页面边框 ... ?我认为实现这一功能非常重要,因为某些主要宗教要求 神圣 文本周围有边框,但人为编写的文本(如引言)周围则不需要
jeffh 1.4k 发布 提问于 四月 8, 2024
0
1 个回答 155 次浏览
(我似乎记得有关于此的讨论,但现在找不到了……) 在我使用 PTXprint 生成的 PDF 中,我希望在圣经书卷周围添加边框,但在词汇表周围不要添加。我该如何告诉 PTXprint 不要在 GLO 书卷的页面周围添加边框?
jeffh 1.4k 发布 提问于 五月 10, 2021
0
2 个回答 201 次浏览
我想打印多卷书( 五卷书信 加上腓利门书) 帖撒罗尼迦前书在第5页顶部以5行结束,但帖撒罗尼迦后书从第6页开始 帖撒罗尼迦后书在第8页以15行结束,但提摩太前书从第9页开始 提摩太后书在第18页以9行结束,但提多书从第19页 ... 13行结束,但腓利门书从第22页开始 在我看来,似乎有很多未使用的空间可以利用 PTXPrint 可以做到吗?感谢任何帮助
Paul 642 发布 提问于 六月 2, 2021
Welcome to Support Bible, where you can ask questions and receive answers from other members of the community.
Accept the one whose faith is weak, without quarreling over disputable matters.
Romans 14:1
3,045 个问题
6,005 个回答
5,671 条评论
2,026 位用户