我想首先问这个问题,这是我正在撰写的文档发布的要求,通常不会使用这种格式。
我正在尝试格式化列表(例如目录、图片列表、参考书目等)的标题,使其根据它是列表的第一个、最后一个还是中间部分而自动更改。例如,如果目录有五页长,则第一页的标题将显示“目录”,第二至第四页的标题将显示“目录(续)”,最后一页的标题将显示“目录(完结)”。
我已使用 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。这个宏更改是必要的,因为将发出一个(实际上是,但仍然)将其第一页设置为具有页面样式(使用)。通过到我们确保页面样式与 完全相同。之后将保持。设置 后,我们可以确保第一页和后续页面都具有正确的页面样式。最终页面的样式也是使用 设置的,之后关闭组并发回页面(再次使用)。\clearpage
oneside
\begingroup
\let\ps@plain\ps@tocstart
\tableofcontents
\chapter
\chapter*
plain
\thispagestyle{plain}
\let
\ps@plain
\ps@tocstart
plain
tocstart
\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}
multido
和lipsum
用于创建一个目录跨越多页(至少 3 页)的虚拟文档。
当然,同样的方法也适用于其他列表,例如 LoF、LoT 和 Bilbiography,每个列表都有自己的风格。