当自动创建列表(例如 ToC)时,是否可以根据列表的页面来格式化页眉?

当自动创建列表(例如 ToC)时,是否可以根据列表的页面来格式化页眉?

我想首先问这个问题,这是我正在撰写的文档发布的要求,通常不会使用这种格式。

我正在尝试格式化列表(例如目录、图片列表、参考书目等)的标题,使其根据它是列表的第一个、最后一个还是中间部分而自动更改。例如,如果目录有五页长,则第一页的标题将显示“目录”,第二至第四页的标题将显示“目录(续)”,最后一页的标题将显示“目录(完结)”。

我已使用 atbegshi 通过在样式文件中使用此代码来获取该部分每一页的主标题(例如“目录”、“图表列表”等):

\newcommand{\tocheader}{{%
  \bfseries% Font selection
  \hspace*{\fill} \MakeUppercase{\contentsname} % Title heading
  \hspace*{\fill}
  \par
  \hfill%
  \makebox[\@pnumwidth][r]{\underline{Page}}% Page heading
  \par\kern.5\baselineskip% After heading
  }}

但是,我还没有找到根据部分页面更改它的方法。此时,我将手动编辑相应的文件(例如 *.toc、*.lof、*.lot)以使其以这种方式读取。

提前感谢您的帮助和时间。我非常感激。

答案1

您可以使用参考值-用于放置可以获得绝对页码的标签的包。

您可以修补/修改\listof../ \tableof...-宏

  • 在启动相应的列表/表格时放置标签......-thingie。

  • 在相应列表/表格...的末尾放置标签。

  • 具有页眉,其本身放置标签。

然后,您可以将来自标题所放置的标签的绝对页码与来自放置在相应列表/表格...的开头和结尾的标签的绝对页码进行比较,并根据比较结果,要么根本不放置任何额外的短语,要么放置短语(继续),要么放置短语(结束)。

使用文章类,它看起来可能像这样:

\documentclass{article}
\usepackage[abspage]{zref}
%\usepackage{hyperref}

\newcount\mytmpcnt

\makeatletter
\renewcommand\tableofcontents{%
  \global\mytmpcnt=0 %
  \section*{\contentsname
            \@mkboth{\MakeUppercase\contentsname\protect\listcontinue{contents}}%
                    {\MakeUppercase\contentsname\protect\listcontinue{contents}}%
           }%
  \zref@labelbyprops{contentsstart}{abspage}%
  \@starttoc{toc}%
  \zref@labelbyprops{contentsend}{abspage}%
}%
\renewcommand\listoffigures{%
  \global\mytmpcnt=0 %
  \section*{\listfigurename}%
  \@mkboth{\MakeUppercase\listfigurename\protect\listcontinue{figures}}%
          {\MakeUppercase\listfigurename\protect\listcontinue{figures}}%
  \zref@labelbyprops{figuresstart}{abspage}%
  \@starttoc{lof}%
  \zref@labelbyprops{figuresend}{abspage}%
}%
\renewcommand\listoftables{%
  \global\mytmpcnt=0 %
  \section*{\listtablename}%
  \@mkboth{\MakeUppercase\listtablename\protect\listcontinue{tables}}%
          {\MakeUppercase\listtablename\protect\listcontinue{tables}}%
  \zref@labelbyprops{tablesstart}{abspage}%
  \@starttoc{lot}%
  \zref@labelbyprops{tablesend}{abspage}%
}%
\newcommand\listcontinue[1]{%
  \global\advance\mytmpcnt by1\relax
  \zref@labelbyprops{#1\number\mytmpcnt}{abspage}%
  \ifnum\zref@extractdefault{#1start}{abspage}{0}=%
        \zref@extractdefault{#1end}{abspage}{0} \else
    \ifnum\zref@extractdefault{#1\number\mytmpcnt}{abspage}{0}=%
          \zref@extractdefault{#1end}{abspage}{0} \MakeUppercase{\space(Concluded)}%
    \else
      \ifnum\zref@extractdefault{#1\number\mytmpcnt}{abspage}{0}=%
            \zref@extractdefault{#1start}{abspage}{0} \else
        \MakeUppercase{\space(Continued)}%
      \fi
    \fi
  \fi
}%
\makeatother


\pagestyle{headings}
\begin{document}

\tableofcontents
\newpage
\listoffigures
\newpage
\listoftables
\newpage

% In a loop create 99 sections, 99 figures and 99 tables.

\newcount\mytmpcntB
\mytmpcntB=0 %
\loop
\ifnum\mytmpcntB<99\relax
  \advance\mytmpcntB by 1\relax
  \section{Section \number\mytmpcntB}
  \begin{figure}[t]\hrulefill\caption{Figure \number\mytmpcntB}\hrulefill\end{figure}
  \begin{table}[t]\hrulefill\caption{Table \number\mytmpcntB}\hrulefill\end{table}
  Text of section \number\mytmpcntB.
  \newpage
\repeat

\end{document}

在此处输入图片描述 在此处输入图片描述 在此处输入图片描述 在此处输入图片描述 在此处输入图片描述 在此处输入图片描述 在此处输入图片描述 在此处输入图片描述 在此处输入图片描述 在此处输入图片描述 在此处输入图片描述

...

答案2

以下设置可满足您的要求。步骤包括:

  • 使用fancyhdr设置页眉/页脚;

  • 为目录中的每个组件定义一个页面样式,例如tocstart第一页、toccontinued后续页面和tocend最后一页。

  • 使用以下代码片段设置 ToC:

    \cleardoublepage
    \begingroup
    \makeatletter
    \let\ps@plain\ps@tocstart
    \makeatother
    \pagestyle{toccontinued}
    \tableofcontents % This will issue \thispagestyle{plain} for the first page
    \thispagestyle{tocend}
    \endgroup
    \cleardoublepage
    

    首先通过发出 来确保您位于正确的页面上(如果您处于模式,\cleardoublepage这将类似于)。然后我们打开一个组以将宏更改的范围限制为仅适用于 ToC。这个宏更改是必要的,因为将发出一个(实际上是,但仍然)将其第一页设置为具有页面样式(使用)。通过到我们确保页面样式与 完全相同。之后将保持。设置 后,我们可以确保第一页和后续页面都具有正确的页面样式。最终页面的样式也是使用 设置的,之后关闭组并发回页面(再次使用)。\clearpageoneside\begingroup\let\ps@plain\ps@tocstart\tableofcontents\chapter\chapter*plain\thispagestyle{plain}\let\ps@plain\ps@tocstartplaintocstart\pagestyle{toccontinued}\tableofcontents\thispagestyle{tocend}\cleardoublepage

以下是使用上述建议的完整最小示例:

在此处输入图片描述

\documentclass{report}

\usepackage{multido,lipsum}

\usepackage{fancyhdr}

\fancypagestyle{tocstart}{%
  \fancyhf{}% Clear header/footer
  \renewcommand{\headrulewidth}{0pt}% No header rule
  \renewcommand{\footrulewidth}{0pt}% No footer rule
  \fancyhead[R]{\contentsname}% Right header
}
\fancypagestyle{toccontinued}{%
  \pagestyle{tocstart}% Similar to tocstart
  \fancyhead[R]{\contentsname{} (Continued)}% Right header
}
\fancypagestyle{tocend}{%
  \pagestyle{tocstart}% Similar to tocstart
  \fancyhead[R]{\contentsname{} (Concluded)}% Right header
}

\begin{document}

\cleardoublepage
\begingroup
\makeatletter
\let\ps@plain\ps@tocstart
\makeatother
\pagestyle{toccontinued}
\tableofcontents % This will issue \thispagestyle{plain} for the first page
\thispagestyle{tocend}
\endgroup
\cleardoublepage

\sloppy % Just for this example
\multido{\i=1+1}{15}{%
  \chapter{A chapter}\lipsum[1-10]
  \section{First section}\lipsum[11-20]
  \section{Second section}\lipsum[21-30]
  \section{Third section}\lipsum[31-40]
  \section{Final section}\lipsum[41-50]
}

\end{document}

multidolipsum用于创建一个目录跨越多页(至少 3 页)的虚拟文档。

当然,同样的方法也适用于其他列表,例如 LoF、LoT 和 Bilbiography,每个列表都有自己的风格。

相关内容