![为什么页眉和页脚会继承 \spaceskip 的当前值,我该如何阻止这种情况?](https://linux22.com/image/437178/%E4%B8%BA%E4%BB%80%E4%B9%88%E9%A1%B5%E7%9C%89%E5%92%8C%E9%A1%B5%E8%84%9A%E4%BC%9A%E7%BB%A7%E6%89%BF%20%5Cspaceskip%20%E7%9A%84%E5%BD%93%E5%89%8D%E5%80%BC%EF%BC%8C%E6%88%91%E8%AF%A5%E5%A6%82%E4%BD%95%E9%98%BB%E6%AD%A2%E8%BF%99%E7%A7%8D%E6%83%85%E5%86%B5%EF%BC%9F.png)
问题:
我正在使用类似 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
。您需要做一些额外的工作,因为您还要进行更改,而\spaceskip
LaTeX 团队并未预料到这会在文档中途进行修改。¹
满足您需求的解决方案是将默认值恢复\spaceskip
为 的一部分\reset@font
。类似这样的操作可以完成工作:
\makeatletter
\newlength{\defaultspaceskip}
\setlength{\defaultspaceskip}{\spaceskip}
\RenewDocumentCommand{\reset@font}{}
{%
\normalfont
\setlength{\spaceskip}{\defaultspaceskip}%
}
\makeatother
这也会修复一些其他可能的问题,比如如果您的环境中有一个脚注,并且修改了脚注\spaceskip
,\reset@font
则还会将其作为设置脚注文本的一部分(在页面和小页面中)以及启动浮动或边距时调用。
编辑添加
另一种方法可能是仅修改\fontdimen
当前字体的相应部分以获得所需的间距。不过,我不确定这对您的特定应用程序是否可行。
- 在编写我的 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}