下面的代码
\documentclass{article}
\usepackage{kantlipsum}
\usepackage[ngerman,english]{babel}
\begin{document}
\section{Foo}
\kant[1]
\begin{itemize}
\item
\item
\item
\item
\item
\end{itemize}
\kant[2]
\begin{itemize}
\item
\item
\item
\item
\end{itemize}
% \selectlanguage{ngerman}
\section{Baz}
\kant[1]
\end{document}
产生输出
\selectlanguage
取消注释该指令(并使用)时,\begin{otherlanguage}
第二部分被推到第二页。我在包含itemize
s 的文档中注意到了这一点,就像我在此处展示的那样,我无法仅使用文本来重现该问题。
我(大胆)猜测是那是什么\write
发出的指令引入的节点会干扰和\selectlanguage
引入的垂直粘连 。事实上,写作itemize
\section
\makeatletter\write\@auxout{\relax}\makeatother
而不是\selectlanguage
导致同样的问题。
我的猜测对吗?更重要的是,我能做些什么来解决这个问题吗?在实际用例中,章节标题涉及\...name
随语言而变化的。作为解决方法,我可以\foreignlanguage
在章节标题中使用,但我想知道是否有更好的方法。
答案1
你的猜测是正确的。在 的末尾\end{itemize}
,有一条指令
\addvspace{<skip 1>}
已发布并\section
发布
\addvspace{<skip 2>}
因此,在正常情况下,只有较大的跳跃才会产生输出。但是,正如您所观察到的,\write
属于的指令\selectlanguage
使得第二条指令无法\addvspace
知道的数量<skip 1>
,因为垂直列表中的最后一项不再是垂直跳跃。
你可以手动修复这个问题
\setlength{\skip0}{\lastskip}
\addvspace{-\skip0}
\selectlanguage{ngerman}
\addvspace{\skip0}
适用于特别的情况。
没有上述四行的输出
请注意“representation”的正确英文连字符。
输出上面四行
请注意“representation”的英语连字符不正确(由于使用德语连字符规则)。
答案2
hyperref
尽力避免此类副作用。你可以窃取它的命令:
\documentclass{article}
\usepackage{kantlipsum}
\usepackage[ngerman,english]{babel}
\usepackage{hyperref}
\begin{document}
\section{Foo}
\kant[1]
\begin{itemize}
\item
\item
\item
\item
\item
\end{itemize}
\kant[2]
\begin{itemize}
\item
\item
\item
\item
\end{itemize}
\makeatletter
\Hy@SaveLastskip
\selectlanguage{english}
\Hy@RestoreLastskip
\makeatother
\section{Baz}
\kant[1]
\end{document}
(它并不完美,在某些情况下它会抑制断点)。