\vadjust 中 \nobreak 的用途

\vadjust 中 \nobreak 的用途

我正在研究 的定义\@normalcr。在某些情况下,宏会扩展为包含 或\vadjust{\nobreak \relax}\vadjust{\nobreak \vskip 1cm}1cm 是一个例子,更一般地说它是一些长度测量)。

\nobreak这些表达式里面的意义是什么?

提前谢谢了。

编辑:经过一些实验,我在下面提供了自己的答案。请更有经验的用户检查一下?另外,我仍然看不出\vadjust{\relax}和之间有什么区别\vadjust{\nobreak \relax}。有区别吗?

答案1

此外,我仍然看不出\vadjust{\relax}和之间有什么区别\vadjust{\nobreak \relax}。有区别吗?

\vadjust{\relax} 什么也不做。

\vadjust{\nobreak}不管有没有,\relax在当前行之后的垂直列表中插入 10000 的无中断惩罚,这将防止分页在那时候

通过查看构建的垂直列表可以看出,仅使用这个简单的测试不会显示任何效果。

\showoutput\showboxdepth3

\documentclass{article}

\begin{document}

aa  \vadjust{\nobreak}
aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 
aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 
aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 
aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 
aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 
aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 
\end{document}

生成日志

...\glue(\topskip) 5.69446
...\hbox(4.30554+0.0)x345.0, glue set - 0.12003 []
...\penalty 10000
...\penalty 150
...\glue(\baselineskip) 7.69446
...\hbox(4.30554+0.0)x345.0, glue set 0.03998 []
...\glue(\baselineskip) 7.69446
...\hbox(4.30554+0.0)x345.0, glue set 0.03998 []
...\glue(\baselineskip) 7.69446
...\hbox(4.30554+0.0)x345.0, glue set 0.03998 []
...\penalty 150
...\glue(\baselineskip) 7.69446
...\hbox(4.30554+0.0)x345.0, glue set 108.33287fil []
...\glue 0.0 plus 1.0fil
...\glue 0.0
...\glue 0.0 plus 0.0001fil
..\glue(\baselineskip) 23.55556

因此,在第一行之后,有一个 10000 的惩罚,这将阻止分页符,除非因为\clubpenalty这是段落的第一行而明确惩罚 150,因此尽管没有换行符,但第一行之后仍允许换行。

然而,结合设置其他惩罚值(例如\interlinepenalty,,\clubpenalty)以及在此时添加的惩罚\widowpenalty中添加的其他材料可以防止分页。\vadjust

请注意,标准\\*换行符可以防止(或至少阻止)在该行分页,但存在同样的问题\clubpenalty

\showoutput\showboxdepth3

\documentclass{article}

\begin{document}

\vspace*{44\baselineskip}

aa\\*
aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 
aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 
aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 
aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 
aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 
aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa 
\end{document}

\\*在使用惩罚 150 desoite 时是否会分页。

答案2

哦,我想我明白了。但请问有人能确认一下吗?

\vadjust{<vertical list>}在行结束后立即插入一个垂直列表。

但是垂直空间在分页符处被删除。因此,如果我们\vadjust{\vskip 1cm}在页面底部的某行中插入一个,它会插入这个空白的垂直列表,然后新页面会吞没这个列表,所以我们看不到空间。

另一方面,通过包含\nobreak如,\vadjust{\nobreak \vskip 1cm}我们可以确保垂直列表不会跨越页面并且我们确实可以看到它。

例如,此代码区分了以下两种情况:

\documentclass[11pt, a4paper, draft]{article}
\usepackage{lipsum}
\begin{document}
    \lipsum[63-68]

    Here is rather long line which \vadjust{\vskip 1cm} crosses the page, at least it does so with my TeX engine. And here is another sentence. \lipsum[66]
    
\end{document}

对比

\documentclass[11pt, a4paper, draft]{article}
\usepackage{lipsum}
\begin{document}
    \lipsum[63-68]

    Here is rather long line which \vadjust{\nobreak \vskip 1cm} crosses the page, at least it does so with my TeX engine. And here is another sentence. \lipsum[66]
    
\end{document}

在第一种情况下,看起来就像\vadjust{...}不存在一样。在第二种情况下,\nobreak强制将垂直空间(以及调用 的行\vadjust)放在新页面上。

\vadjust{\nobreak\relax} (=\vadjust{\nobreak})其余部分是在 David Carlisle 的回答之后添加的。正如 David Carlisle 的回答中所述,和之间存在差异\vadjust{\relax},但上面的例子不会显示这一点,因为跨页的行是段落的第一行,因此它会得到自己的惩罚,该惩罚在\nobreak惩罚之后更新(其值仅为 150 - 允许分页符)。但修改我上面的例子以在自然分页符之前显示段落的两行确实显示了差异:

\documentclass[11pt, a4paper, draft]{article}
\usepackage{lipsum}
\begin{document}
    \lipsum[72-76]

    This is an extremely long sentence which will run over three lines including going across the page and to fill it out I am writing\vadjust{\nobreak} a lot of unnecessary words such as `vituperous' and `rebarbative'. And here is another sentence. \lipsum[66]
    
\end{document}

对比

\documentclass[11pt, a4paper, draft]{article}
\usepackage{lipsum}
\begin{document}
    \lipsum[72-76]

    This is an extremely long sentence which will run over three lines including going across the page and to fill it out I am writing\vadjust{} a lot of unnecessary words such as `vituperous' and `rebarbative'. And here is another sentence. \lipsum[66]
    
\end{document}

第一种情况现在可以防止换行,因此段落的第二行会转到新页面,而第二种情况它仍保留在第一页。

相关内容