\selectlanguage 将部分内容推送到新页面

\selectlanguage 将部分内容推送到新页面

下面的代码

\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}第二部分被推到第二页。我在包含itemizes 的文档中注意到了这一点,就像我在此处展示的那样,我无法仅使用文本来重现该问题。

我(大胆)猜测是那是什么\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}

(它并不完美,在某些情况下它会抑制断点)。

相关内容