ledpar:如何在 {pages}-environment/stanzas 中强制分页?

ledpar:如何在 {pages}-environment/stanzas 中强制分页?

我如何在 的环境中强制在 到 s 之间或甚至在单个 的两行之间进行分页ledpar{pages}\stanza提出\stanza这个问题的原因是,ledpar有时会在一节经文和下一行的延续之间分页,例如

这是一首太长的诗句
ledpar在此处插入分页符 —
(缩进)单行

这样读起来不太好,我想在“这是...”之前强制分页。

在“的评论中ledmac/-par:没有 versesyncing 但有 pagesyncing“diabonas 建议手动停止left-/ rightpage/ \Pages-construc 以强制分页,但我希望有更优雅的方式……?

这是一个用于测试的最小示例。我尝试了三个版本;相关代码标有 [n]。

\documentclass{scrartcl}
\usepackage{geometry}% very small pages to see an effect
\geometry{paperheight=4cm,paperwidth=6cm,vmargin=1cm}
\usepackage{ledmac,ledpar}

\begin{document}
\begin{pages}
    \begin{Leftside}
    \beginnumbering
    \setstanzaindents{2,0,0,0}
    \stanza 1 & 2 & 3 \&
    \stanza 4 & 5 & 6 \&
%   \stanza\pagebreak\&% [1] doesn't work
%   \pagebreak% [2,3] doesn't work too
    \stanza 7 & 8 & 9 \&
    \endnumbering
    \end{Leftside}
    \begin{Rightside}
    \beginnumbering
    \setstanzaindents{2,0,0,0}
    \stanza one & two & three \&
    \stanza four & five & six \&
%   \stanza\pagebreak\&% [1] doesn't work
%   \pagebreak% [3] doesn't work too
    \stanza seven & eight & nine \&
    \endnumbering
    \end{Rightside}
    \Pages
\end{pages}
\end{document}

答案1

从漂亮的编码角度来说,这个解决方案当然不是“更优雅的方法” - 事实上它恰恰相反! - 但它似乎有效:

代码:

\usepackage{etoolbox}
\makeatletter
\newcommand*{\pageisfull}{\def\checkpageL{\l@dpagefulltrue\l@dsamepagefalse}}
\newcommand*{\fakelineL}{{\ledRcolfalse\new@line\startlock\skipnumbering\endlock\null}}
\newcommand*{\fakelineR}{{\ledRcoltrue\new@lineR\startlock\skipnumbering\endlock\null}}
\patchcmd{\Pages}{\hb@xt@ \hsize{\ledstrutL\unhbox\l@dleftbox}}{\ifdim\dp\l@dleftbox=12mm\pageisfull\fakelineL\else\hb@xt@ \hsize{\ledstrutL\unhbox\l@dleftbox}\fi}{}{}
\patchcmd{\Pages}{\hb@xt@ \hsize{\ledstrutR\unhbox\l@drightbox}}{\ifdim\dp\l@drightbox=12mm\fakelineR\else\hb@xt@ \hsize{\ledstrutR\unhbox\l@drightbox}\fi}{}{}
\makeatother
\newcommand*{\ledparpagebreak}{\stanza\strut\vrule depth12mm\&}

解释:

修改了中央输出例程,\Pages以检查要插入的框是否具有 的深度。这对于普通框来说不太现实,因此它将在此时作为分页符的标记。如果发现这样的特殊框,则不会输出 - 而是执行12mm新定义的宏\fakelineL/\fakelineR和:\pageisfull

\fakeline.如果确实有一行需要插入,这些命令就会执行,但它们会执行必要的宏来跳过此行的行号。这可能听起来很奇怪,但事实证明这是必要的,(希望)可以获得正确的行号。

\pageisfullhack\checkboxL控制是否需要分页符,以便强制打开新页面。(此重新定义是本地的,因为它位于 中的一个组内\Pages,因此我们不必重置更改,因为这会在组末尾自动完成。)

现在我们只需要定义一个宏\ledparpagebreak,插入这样一个深度框12mm以便能够控制分页:它开始一个新的节(否则,输出例程无法正确处理它)并设置\vrule所需的深度。

用法:

只需在加载后将代码添加到 LaTeX 文档中ledpar即可。然后,您可以\ledparpagebreak在两个节之间使用以在此处插入分页符。确保使用中的命令两个都列(在相应的节之后,否则您可能会观察到奇怪的行为......)。

您可以将此 hack 与答案中建议的补丁一起使用你的相关问题因为两者应该兼容。

警告:

正如我所说,这不是一个干净的方法根本,我无法保证在所有情况下都能正确行事,尤其是关于一致的行号(但它在我的测试文本中运行正常)。

更好的办法可能是利用所谓的“操作代码列表” ledmac:在我看来,它是专门为在某些行执行特殊任务而制作的,例如开始新页面。但是,我对ledmac/的内部结构了解ledpar不够,无法使用它。

相关内容