问题
我创建了 tex 模板,为页面添加了字典样式的标题,这意味着它包含页面中的第一个和最后一个条目。
到目前为止,一切正常,但是当我向条目添加带有替代文本(用于标题)的可选参数时,页面上的第一个和最后一个条目无法正确计算:
在第 1 页上,标题中显示第 2 页上第一个条目的替代文本,
而在第 2 页上,标题中显示第 2 页上第二个和最后一个条目的替代文本。
第一页的标题如下:
当我从 a2 条目中删除替代文本时,标题是正确的(第 1 页上的 a - a1;第 2 页上的 a2 - a)。我甚至可以将替代文本“b1”添加到 a1 条目,它将正确显示在标题中(第 1 页上的 a - b1;第 2 页上的 a2 - a)。
问题
您能看出我的代码有什么错误吗?或者它是 fancyhdr 库中的一个错误?
重现问题的代码:
我正在通过 XeLaTeX 运行以下内容
\documentclass[twocolumn,10pt,a4paper,twoside]{book}
\usepackage{fancyhdr}
\usepackage[document]{ragged2e}
\usepackage[left=2.5cm, right=1.85cm,top=1.85cm, bottom=1.85cm]{geometry}
\usepackage{hanging}
\usepackage{ifthen}
\newcommand\entry[3][]{\ifx\relax#1\relax\par\hangpara{1em}{1}\markboth{#2}{#2}\else\par\markboth{#1}{#1}\fi\textbf{#2} #3}
\pagestyle{fancy}
\fancyhf{}
\fancyhead[LE,RO]{\textbf{\ifthenelse{\equal{\rightmark}{\leftmark}}{\rightmark}{\rightmark\ -- \leftmark}}}
\fancyhead[LO,RE]{\textbf{\thepage}}
\begin{document}
\RaggedRight
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a1}{ - no alternative text}%
\entry[b2]{a2}{- b2 as alternative text}%
\entry[b3]{a3}{- b3 as alternative text}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\entry{a}{}%
\end{document}
答案1
您在 vmode 中发出 \markboth,位于 \par 之后。这意味着它可以与后面的文本分开。
使用\leavevmode\markboth
,或者将 \markboth 移到 \textbf 后面或内部。
当前的 LaTeX 包含对标记的扩展支持。文档可在 ltmarks-doc.pdf 中找到。
答案2
传统命令 \leftmark 和 \rightmark 的灵活性有限
- \leftmark 总是选取页面上的最后一个标记(来自最后一个 \markboth)
- \rightmark 总是选择页面上第一个来自第一个 \markboth 或 \markright 的标记
- \topmark 不受支持(以前也从未支持过),因为它是一个原始命令,只适用于纯 TeX,而不适用于 LaTeX,因为它假定除非您发送页面,否则永远不会调用输出例程。如果您使用它,您将获得 \markboth 的两个参数的值(因此是双“b2”)
您看到奇怪的标记的原因是您的 \markboth 命令未附加到文本,因此页面上的最后一个标记实际上是 \markboth{b2}{b2}。如果您执行 \showoutput 并查找标记命令,您可以轻松看到这一点。您还可以使用 \DebugMarksOn 看到这一点。
无论如何,在旧系统中,您根本无法创建字典标题,因为 \topmark 不起作用。在新实现中,您可以这样做,但不是通过使用 \topmark,而是通过使用新命令 \TopMark \FirstMark 和 \LastMark 以及标记类 2e-left、2e-right 和 2e-right-nonempty。这些预定义类由 \markboth 和 \markright 填充,因此 \TopMark{2e-left} 为您提供页面上的“顶部”情况。
但是新机制具有更精细的控制,您可以获得列的标记,并且可以定义自己的类,然后使用 \PutMark 而不是传统的命令。
正如 Ulrike 所说,所有这些都在 ltmarks-doc.pdf 中进行了解释,并且在新版 LaTeX Companion 第 3 版的许多示例中也进行了解释,我很高兴地说,该版的出版日期是 2023 年 4 月 28 日。
答案3
这可能是 LaLeX 的一个错误。LaTeX 中的标记处理最近进行了大修,因此如果发现错误,我并不感到惊讶。我希望 LaTeX 开发人员能够调查此事,或者我应该提交错误报告。
当我跟踪并查看代码时,我发现 b2 条目转到\topmark
,甚至在第二页上翻倍(即\topmark=b2b2
)。然后 b3 条目转到rightmark
。令人惊讶的是,在第一页上,\leftmark=b2
,即使b2
在这一页上没有出现 。
您可以通过\fancyhead[LE,RO]
用 替换条目来轻松看到这一点\fancyhead[LE,RO]{topmark=\topmark / leftmark=\leftmark / rightmark=\rightmark}
。