为什么页眉和页脚会继承 \spaceskip 的当前值,我该如何阻止这种情况?

为什么页眉和页脚会继承 \spaceskip 的当前值,我该如何阻止这种情况?

问题

我正在使用类似 listings 的包在论文中显示源代码。该包定义的环境用于\spaceskip=\fontdimen2确保所有空格的宽度相同。

当在该环境中发生分页符时,前一页的页眉和页脚将继承空格跳过设置,并且具有过宽的空格(下面的 MWE):

坏标头

是什么原因造成的?我该如何防止?如果这是环境定义中改变 \spaceskip 的错误,应该如何修复?

平均能量损失spaceskip设置为较大的值以突出问题):

\documentclass[twoside]{article}

\usepackage{lipsum}

\pagestyle{myheadings}
\markboth{This one does not.}{This header has wide spaces.}

\begin{document}
\lipsum[1-5]

\bgroup\footnotesize\spaceskip=10\fontdimen2\font%
a b c

d e f

g h i
\egroup
\end{document}

答案1

当您开始页眉时,分页符处生效的字体设置将在页眉中生效。LaTeX 通过调用 使页眉恢复“正常”,\reset@font默认情况下只调用\normalfont。您需要做一些额外的工作,因为您还要进行更改,而\spaceskipLaTeX 团队并未预料到这会在文档中途进行修改。¹

满足您需求的解决方案是将默认值恢复\spaceskip为 的一部分\reset@font。类似这样的操作可以完成工作:

\makeatletter
\newlength{\defaultspaceskip}
\setlength{\defaultspaceskip}{\spaceskip}
\RenewDocumentCommand{\reset@font}{}
   {%
    \normalfont
    \setlength{\spaceskip}{\defaultspaceskip}%
   }
\makeatother

这也会修复一些其他可能的问题,比如如果您的环境中有一个脚注,并且修改了脚注\spaceskip\reset@font则还会将其作为设置脚注文本的一部分(在页面和小页面中)以及启动浮动或边距时调用。

编辑添加

另一种方法可能是仅修改\fontdimen当前字体的相应部分以获得所需的间距。不过,我不确定这对您的特定应用程序是否可行。


  1. 在编写我的 LaTeX 书时,我遇到了类似的问题,因为我\normalfont的书中对 有两个不同的定义,取决于它是书的正文还是示例 LaTeX 输出。

答案2

您可以使用保存箱。它们在创建时就被格式化了。

\documentclass[twoside]{article}

\usepackage{lipsum}

\newsavebox{\leftmarkbox}
\newsavebox{\rightmarbox}
\savebox\leftmarkbox{Left header}
\savebox\rightmarkbox{Right header}
\pagestyle{myheadings}
\markboth{\usebox\leftmarkbox}{\usebox\rightmarkbox}

\begin{document}
\lipsum[1-5]

\bgroup\footnotesize\spaceskip=10\fontdimen2\font%
a b c

d e f

g h i
\egroup
\end{document}

相关内容