每页顶部都有章节提醒吗?

每页顶部都有章节提醒吗?

有没有办法在每页顶部的标题下放置当前章节/部分/小节的提醒?如下所示:

第 1 页第2页

但不那么尴尬/丑陋/分散注意力。:)

想法

也许可以在“开始新页面”钩子中完成此操作。有这样的功能吗?

我尝试使用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

相关内容