如何让 \markboth 在 \tcolorbox 和 \longtable 环境中工作?

如何让 \markboth 在 \tcolorbox 和 \longtable 环境中工作?

所以我正在编辑一份历史手稿,我希望手写手稿的原始页码出现在页眉中,无论是左页还是右页。此外,它们还需要出现在文本中,在每个原始页面的开头(可以是打印页面上的任何位置)。

我使用一个名为的命令实现了此功能,\origpage该命令打印原始页码并执行 \markboth 命令来更改页眉。

到目前为止一切顺利。只是有时原始页码会出现在表格中(使用 呈现\longtable)或框的开头(使用 呈现\tcolorbox)。在这些情况下,\markboth命令不知何故无法“到达”运行头,显然是因为它被包裹在\tcolorbox\longtable环境中。\markboth不过,当命令被包裹在空白环境中时,它会起作用,因此阻止其效果的不是环境本身。

此处的 MWE 仅显示\tcolorbox情况。如果您编译代码,您将看到前十个原始页面正确创建了运行头,但第十一和第十二个原始页面失败,但第十三和第十四个页面再次正常工作。

为什么会失败?

\tcolorbox有人能帮我想出一种方法,即使在或中也能将原始页码显示在页眉中吗\longtable?使用会有\fancyhdr帮助吗?

% !TEX TS-program = lualatex
% !TEX encoding = UTF-8 Unicode
% !TEX spellcheck = en_EN

\documentclass[letterpaper,12pt]{book}
\usepackage[english]{babel}
\usepackage{fontspec}

\usepackage{lipsum}

\usepackage{tcolorbox}
\tcbuselibrary{breakable}

\newcommand{\origpage}[1]{%
   {\textsf{\large{[#1.]}}}%
   \markboth{\hfill #1 \hfill}{\hfill #1 \hfill}
}

% +++++++++++++++++++++++++++++++++++++++++++

\begin{document}

\pagenumbering{gobble}

\origpage{1} \lipsum \lipsum \origpage{2} \lipsum \lipsum \origpage{3} \lipsum \lipsum \origpage{4} \lipsum \lipsum \origpage{5} \lipsum \lipsum \origpage{6} \lipsum \lipsum \origpage{7} \lipsum \lipsum \origpage{8} \lipsum \lipsum \origpage{9} \lipsum \lipsum \origpage{10} \lipsum \lipsum 

\begin{tcolorbox}[width=\linewidth,valign=center,breakable]
\origpage{11} \lipsum \lipsum \origpage{12} \lipsum \lipsum
\end{tcolorbox}

\origpage{13} \lipsum \lipsum \origpage{14} \lipsum \lipsum

\end{document}

答案1

我最终解决了这个问题,并得到了我想要的输出,尽管使用了两个棘手的解决方法。但它们并不适用于所有情况。

\longtable环境中:我刚刚结束了longtable,排版了原始页码(以便结果\markboth位于顶层),然后重新启动了表格。这不是我作为文档设计师想要的,但也不是一场灾难。

使用\tcolorbox: 在我的实际代码中,\tcolorbox环境会调用 (称之为\mybox)。起初,我尝试让\origpage中的命令\tcolorbox设置一个标志,该标志将由环境的右括号保留和分析\mybox。但是,在 结束后,该标志的值没有保留\tcolorbox。所以这种方法不起作用。(也许 可以解决\gdef?)

我找到了另一种可行的方法。那就是将原始页码更改为\mybox环境的可选参数。这允许环境使用 if 语句在顶层\mybox发出命令,并发出在 内显示原始页码的命令。这只在我的情况下有效,因为很短并且从不跨越分页符,并且原始页码始终出现在框的开头。使用环境定义是必要的,因为参数必须在环境语句的右括号中使用。这不是我想要设置文件的方式,而且我发现它不是很优雅,但它确实完成了工作。\markboth\origpagetcolorbox\tcolorboxesxparse

本质上是这样的:

\NewDocumentEnvironment{mybox}{o}
 {
  \begin{tcolorbox}
  \IfValueT{#1}{{\large{[#1.]}}}
 }
 {
  \end{tcolorbox}%
  \IfValueT{#1}{\markboth{\hfill #1 \hfill}{\hfill #1 \hfill}}%
 }

相关内容