![为什么浮点数会改变 \mark?](https://linux22.com/image/231583/%E4%B8%BA%E4%BB%80%E4%B9%88%E6%B5%AE%E7%82%B9%E6%95%B0%E4%BC%9A%E6%94%B9%E5%8F%98%20%5Cmark%EF%BC%9F.png)
浮点数的存在似乎会破坏 s 的设置\mark
,因此\topmark
最终会得到错误的值。
例如,考虑以下情况:
\documentclass{article}
\textheight 50mm
\textwidth 50mm
\makeatletter \def\@oddhead{[\topmark/\firstmark/\botmark]} \makeatother
\def\block#1{\textbf{#1}\mark{#1}
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do
eiusmod tempor incididunt ut labore et dolore magna aliqua.
Foo bar baz.\par}
\begin{document}
\block a
\block b
\block c
\block d
%\begin{figure}\hrule width 1pt height 20mm depth 0pt \end{figure}
\block e
\end{document}
一切按预期运行:分页符出现在块“c”的中间,块“d”和“e”从第 2 页开始,因此页眉显示“[c/d/e]”。没错。
但是,如果我取消注释该{figure}
行,则“图”会出现在第 3 页,而第 2 页保持不变(分页符在块“c”和“e”内),但标题现在显示“[d/d/e]”。
\@float
我很困惑为什么会发生这种情况。我在或中找不到任何\@caption
与标记相关的内容,而且通常 中也没有latex.ltx
使用\markboth
或 的内容\markright
(它们是唯一latex.ltx
调用 的内容\mark
)。 article.cls
有一些调用 的内容,但它们与 以及图表列表和索引\@mkboth
相关联。\@part
我遗漏了什么?
答案1
回答我自己的问题...
这里的问题是,坦率地说,LaTeX 搞乱了 TeX\mark
系统:\firstmark
虽然\botmark
仍然可以工作,但\topmark
实际上却不行。这是因为 LaTeX 的浮点算法(它处理\marginpar
图形和表格)可以在页面之间以外的时间调用输出例程。这必然会以某种方式进入,\botmark
这\topmark
意味着\topmark
不再是\botmark
上一页末尾的值。
LaTeX 的\markboth
系统使用 TeX\mark
系统,但专门用于运行章节标题的情况,并且似乎无法重新利用。
multicol 和 fixltx2e 包(以及它们都引用的 fixmarks 包)解决了多列页面的情况的这个问题,但是其解决方法与\topmark
这里所示情况不同。
我的具体情况是这样的:我正在布置试卷,想在从问题 x 中间开始的页面顶部放置一个 [Qx cont'd]。我曾经\mark{x}
在每个问题的开头放置:测试\topmark
工作正常,直到试卷中包含数字。我让它工作得有点笨拙。我\mark{1x}
在每个问题的开头和\mark{0x}
结尾放置:然后我可以通过查看开头的数字来判断\firstmark
我是否仍在问题中。
编辑:虽然这是个好主意,但事实证明更有效的解决方案是\botmark
手动保存,\xdef\my@topmark{\botmark}
在页脚中使用。这可以在以下页眉中进行检查,它具有与相同的语义(完全相同?)\topmark
。可能有一些病态的情况,这种方法不起作用,但我还没有遇到过。
答案2
如果问题是如何使用最高分,请参阅我的包titleps
。另请参阅如何在页面顶部添加“续”部分标题?。