marginpar 和孤儿

marginpar 和孤儿

如果我使用,如何避免孤行\marginpar

例如,这里有一个两页的文档,其中没有任何孤立文件:

\documentclass[letterpaper]{article}
\usepackage{lipsum}
\clubpenalty=10000
\widowpenalty=10000
\begin{document}
    \lipsum[1-5]
    Foo. \lipsum[6-7]
\end{document}

但是,如果我添加 marginpar,布局就会改变,并且会出现一条孤立线:

\documentclass[letterpaper]{article}
\usepackage{lipsum}
\clubpenalty=10000
\widowpenalty=10000
\begin{document}
    \lipsum[1-5]
    Foo.\marginpar{Test} \lipsum[6-7]
\end{document}

(看来\marginnote从包中marginnote没有同样的问题。)

答案1

我担心答案是,对于 2e 来说,\marginpar这是预期的行为。原因是 LaTeX2e 通过在当前行后调用输出例程来实现边注。然后在 OR 中,它将查看页面的当前状态并相应地附加边注,即在左侧或右侧。然后它将构造的材料返回到主画廊并让 TeX 继续排版。

那么为什么这会导致孤儿呢?为了触发输出例程,LaTex 必须设置一个特殊的惩罚项来表示边际。现在,每当页面构建器被执行时,触发它的惩罚项都会停留在“最近贡献”的顶部,以便在 OR 完成后进行查看,但这个惩罚项也会自动更改为 10000(即,永远不会再成为断点)。

因此,一个通常是有效断点的位置(例如,没有特殊惩罚的正常行的末尾)可能会变成非断点,因为我们现在突然\penalty 10000在这个地方有了。现在反过来可能意味着 LaTeX 被迫在较早的位置断页,从而将带有 marginpar(或使用相同机制的浮动)的行移动到下一个行。现在所有的 LaTeX OR 算法都假设这种情况永远不会发生,也就是说,如果在一页上看到浮动或 marginpar,那么这也意味着它将出现在这一页上。因此,OR 明确地添加了一个惩罚以确保存在有效的断点。不幸的是,在特殊情况下,这不是您想要的。

因此,除了手动更正之外,您在这里能做的事情不多。此时有用的方法是使用 来长页面或短页面\enlargethispage,或者使用边距在行前设置显式分页符,或者尝试应用 2.09 命令/环境\samepage,如下所示:

\documentclass[letterpaper,twoside]{article}
\usepackage{lipsum}
\clubpenalty=10000
\widowpenalty=10000

\begin{document}
    \lipsum[1-5]
\begin{samepage}
    Foo.\marginpar{Test} \lipsum[6-7]
\end{samepage}

   Bar.\marginpar{Test} \lipsum[6-7]
\end{document}

但在这种情况下出现的问题显而易见(这就是 LaTex 不这样做的原因):如果twoside像我在插图中所做的那样添加了该选项,则边距会出现在错误的一侧。

相关内容