有没有办法在每页顶部的标题下放置当前章节/部分/小节的提醒?如下所示:
但不那么尴尬/丑陋/分散注意力。:)
想法
也许可以在“开始新页面”钩子中完成此操作。有这样的功能吗?
我尝试使用afterpage
按照建议打包LaTeX 社区论坛主题,但没起作用(见afterpage + 列表 = 缺少 \item)。
动机
我经常发现自己迷失在冗长复杂的技术参考文献中。经过一段时间令人麻木的阅读后,我不知道自己身在森林的哪个角落,因为我看到的只有树木。在每页顶部打印当前章节/部分/小节的名称可以帮助我记住上下文。
答案1
我几乎已经想通了。它涉及修补分段命令并用于\afterpage
在下一页顶部绘制提醒。
以下是目前的代码:
\makeatletter%
\newcounter{cont@level}%
\setcounter{cont@level}{-1}%
\newrobustcmd{\cont@err}[1]{\PackageError{cont}{can't patch \protect#1}{}}%
\apptocmd{\@part}{%
\setcounter{cont@level}{0}\gdef\cont@part{#2}}{}{\cont@err{\@part}}%
\apptocmd{\@chapter}{%
\setcounter{cont@level}{1}\gdef\cont@chapter{#2}}{}{\cont@err{\@chapter}}%
\apptocmd{\@sect}{%
\global\defcounter{cont@level}{#2 + 1}%
\csgdef{cont@#1}{#8}}{}{\cont@err{\@sect}}%
\newrobustcmd{\cont@showonnext}{%
\afterpage{%
\ifnumgreater{\value{cont@level}}{-1}{%
\hbox{%
\scriptsize%
\itshape%
\setlength{\fboxsep}{0.5pt}%
\colorbox[gray]{0.9}{%
\begin{minipage}[b]{\textwidth-2\fboxsep}%
\noindent%
\strut%
Continued from:%
\\\thepart{} \cont@part%
\ifnumgreater{\value{cont@level}}{0}{%
\\\thechapter{} \cont@chapter}{}%
\ifnumgreater{\value{cont@level}}{1}{%
\\\thesection{} \cont@section}{}%
\ifnumgreater{\value{cont@level}}{2}{%
\\\thesubsection{} \cont@subsection}{}%
\ifnumgreater{\value{cont@level}}{3}{%
\\\thesubsubsection{} \cont@subsubsection}{}%
\strut%
\end{minipage}%
}%
\strut%
\vspace{\baselineskip}%
}%
}{}%
\cont@showonnext%
}%
}%
\cont@showonnext%
\makeatother%
代码相当粗糙(我不是技术人员),但它基本上满足了我的要求。它在每个页面的顶部放置一个灰色框,就像问题中的示例一样。以下是它的一些问题:
- 它会在文档末尾创建一个带有连续块的额外页面。这个问题应该很容易解决。
- 如果某个部分从新页面的顶部开始,则会出现问题:
- 它不知道前一部分已经结束。我不确定如何检测某一部分的结束。请参阅我的另一个问题知道它位于某个部分末尾的宏?
- 文本是错误的。我猜这是因为
\section
在做出分页决定之前执行了新部分的命令(例如)。我想我必须使用标记来解决这个问题。 - 有时它会在章节标题下绘制提醒文本(就像在输出例程中更改了原始分页符一样)
- 它不适用于
\section
等带星号的版本。 - 写的时候
report
考虑到了这一点,但可能不适用于其他课程 - 输出结果很丑陋。代码本身可能也很丑陋。:)
答案2
一个解决方案是重新定义\sectionmark
和\subsectionmark
。可以按如下方式完成:
\usepackage{fancyhdr}
\pagestyle{fancy}
\renewcommand{\subsectionmark}[1]{\markright{#1}}
\renewcommand{\sectionmark}[1]{\markboth{#1}{}}
这将产生与图片中相同的外观,但现在没有章节/子章节编号,并且使用普通字母而不是大写字母。如果您仍然想要章节/子章节编号,那么一种可能性是:
\usepackage{fancyhdr}
\pagestyle{fancy}
\renewcommand{\subsectionmark}[1]{\markright{\thesubsection \quad #1}}
\renewcommand{\sectionmark}[1]{\markboth{\thesection \quad #1}{}}
有一件重要的事情需要注意。这两个\renewcommand
必须出现在命令之后\pagestyle{fancy}
。除此之外,还有无数种选择这些“提醒”格式的可能性。
命令\markright
和\markboth
的作用是,\markright
设置 的值\rightmark
,并设置和 的\markboth
值。因此,这些命令和可用于自定义页眉和页脚,例如:\leftmark
\rightmark
\leftmark
\rightmark
\lfoot{}
\rfoot{}
\cfoot{ \thepage }
\rhead{ {\scshape \leftmark} }
\lhead{ {\scshape \rightmark} }
\chead{}
在设置时,之所以要将设置\rightmark
为空白,就像上面\leftmark
的解决方案一样\renewcommand
,是因为您不想列出前一节的最后一个小节的名称,直到您在新节中创建一个小节。
\chaptermark
如果您选择了支持章节的文档类,那么您应该通过替换\sectionmark
和\sectionmark
替换来执行上述构造\subsectionmark
。