我用复印机制作教材。但是,复印机最多只能装订 50 张小册子,而且我并不总是在课程开始日期之前写完教材的后面部分。(如果报名的学生太少,课程就会被取消。)
因此,我将书分成几部分。每部分都有单独的封面和目录页。为了简化起见,这样做的方式应该是
主要内容是所有内容的定期列表;
书中第 2 部分及以后部分的内容不包括当前部分之后的部分的内容,并且它们以不同的颜色打印当前部分之前的部分的内容。
为了做到这一点,我使用了etoc
多个目录,以及一些文件技巧toc
:
\documentclass[oneside,openany]{book}
\usepackage{etoc,xparse,xcolor}
\makeatletter
\newcounter{packetcount}
\setcounter{packetcount}{1}
\NewDocumentCommand\packetpart {}{%
\clearpage%
\thispagestyle{empty}%
\stepcounter{packetcount}%
Title page goes here
\clearpage\thispagestyle{empty}\cleardoublepage
\tableofcontents
\clearpage\thispagestyle{empty}\cleardoublepage}
\newcommand*{\tocfade}{%
\addtocontents{toc}{\protect\colorlet{toccol}{fadedtoc}}%
\addtocontents{toc}{\color{toccol}}}
\newcommand*{\tocon}{%
\addtocontents{toc}{\protect\colorlet{toccol}{ontoc}}%
\addtocontents{toc}{\color{toccol}}}
\newcommand*{\tocoff}{%
\addtocontents{toc}{\protect\colorlet{toccol}{offtoc}}%
\addtocontents{toc}{\color{toccol}}}
\def\addcontentsline#1#2#3{%
\addtocontents{#1}{\protect\contentsline{#2}{#3}{\color{toccol}\thepage}}}
\newcommand*{\maintoc}{%
\colorlet{origfadedtoc}{fadedtoc}%
\colorlet{origontoc}{ontoc}%
\colorlet{origofftoc}{offtoc}%
\colorlet{fadedtoc}{black}%
\colorlet{ontoc}{black}%
\colorlet{offtoc}{black}%
\tableofcontents
\colorlet{fadedtoc}{origfadedtoc}%
\colorlet{ontoc}{origontoc}%
\colorlet{offtoc}{origofftoc}}
\makeatother
\colorlet{toccol}{black}
\colorlet{fadedtoc}{yellow}
\colorlet{ontoc}{blue}
\colorlet{offtoc}{white}
\begin{document}
Main title page goes here.
\maintoc
\tocfade
\chapter{Chapter One}
\section{A section}
\section{Another section}
\tocon
\packetpart
\chapter{Chapter Two}
\section{A middle section}
\section{Another middle section}
\tocoff
\packetpart
\chapter{Chapter Three}
\section{A later section}
\end{document}
这正如预期的那样工作。主要内容如下:
第 2 部分的内容如下:
.toc
但是,所有其他部分的内容都与第 2 部分的内容一样,因为我已经在特定点将颜色变化写入文件,并且\tableofcontents
无论哪个部分是当前活动的部分,都会读取相同的代码。
这意味着我必须手动移动\tocon
和\tocoff
命令才能生成书中的不同部分,并且每次都必须重新编译文件两次。例如,要生成第三部分,我必须删除命令\tocon
并\tocoff
用 替换命令\tocon
,然后重新编译两次才能正确解析所有内容。这很麻烦。
我希望使用etoc
来避免这种情况。具体来说,我希望在 中施展一些魔法,以所需的方式修改书中该部分\packetpart
的显示。 的一个吸引力在于它确实\tableofcontents
etoc
不是需要额外的辅助文件,其中我已经写了很多。
我已经想出了如何避免\tocoff
使用etoc
概念的需要tag
:
\documentclass[oneside,openany]{book}% made oneside/openany just to reduce pages in test file - actual use case is double-sided
\usepackage{etoc,xparse,xcolor}
\makeatletter
\newcounter{packetcount}
\setcounter{packetcount}{1}
\NewDocumentCommand\packetpart {}{%
\clearpage%
\thispagestyle{empty}%
\stepcounter{packetcount}%
\def\cfr@toctag@packetpart{packetpart\thepacketcount}%
\expandafter\etocdepthtag.toc{\cfr@toctag@packetpart}%
Title page goes here
\clearpage\thispagestyle{empty}\cleardoublepage
\etocsettagdepth{\cfr@toctag@packetpart}{1}%
\stepcounter{packetcount}%
\def\cfr@toctag@nextpacketpart{packetpart\thepacketcount}%
\etocsettagdepth{\cfr@toctag@nextpacketpart}{none}%
\addtocounter{packetcount}{-1}%
\tableofcontents
\clearpage\thispagestyle{empty}\cleardoublepage}
\newcommand*{\tocfade}{%
\addtocontents{toc}{\protect\colorlet{toccol}{fadedtoc}}%
\addtocontents{toc}{\color{toccol}}}
\newcommand*{\tocon}{%
\addtocontents{toc}{\protect\colorlet{toccol}{ontoc}}%
\addtocontents{toc}{\color{toccol}}}
\def\addcontentsline#1#2#3{%
\addtocontents{#1}{\protect\contentsline{#2}{#3}{\color{toccol}\thepage}}}
\newcommand*{\maintoc}{%
\colorlet{origfadedtoc}{fadedtoc}%
\colorlet{origontoc}{ontoc}%
\colorlet{fadedtoc}{black}%
\colorlet{ontoc}{black}%
\tableofcontents
\colorlet{fadedtoc}{origfadedtoc}%
\colorlet{ontoc}{origontoc}}
\makeatother
\colorlet{toccol}{black}
\colorlet{fadedtoc}{yellow}% just for clarity in the example
\colorlet{ontoc}{blue}% just for clarity in the example
\begin{document}
Main title page goes here.
\maintoc
\tocfade
\chapter{Chapter One}
\section{A section}
\section{Another section}
\tocon
\packetpart
\chapter{Chapter Two}
\section{A middle section}
\section{Another middle section}
\packetpart
\chapter{Chapter Three}
\section{A later section}
\end{document}
生成第 2 部分的内容:
第 3 部分:
但是,我无法想出适当更改颜色的方法。也就是说,我无法让第 2 部分的列表在作为第 3 部分内容的一部分显示时显示为黄色。
我必须承认,我对此非常不满意etoc
,而且我的经验有限,所以如果在其详尽的手册中有什么明显的问题,请告诉我,我会很乐意删除这个问题。
如果没有,有办法吗?也就是说,有没有一种半合理/可行的方法来做到这一点?
注意:在任何人对此发表评论之前,我不是内容中确实使用了黄色、蓝色和黑色。我实际上使用的是黑色和灰色。但我认为颜色的更剧烈变化会使示例更清晰。
答案1
我建议采用以下方法,这是一种更轻松的方法,但不可否认的是,有点不合时宜。
这埃托克 tag
的用途是决定打印目录中的哪些部分。如果我们按照这种方式操作,我们就会像 OP 的代码一样,在每个新内容中添加标签包但是,我们还必须找到方法将所有进一步的数据包的级别设置为不可见,这在包含几个这样的数据包的文档中可能是可以的,但无论如何有些麻烦。
尽管如此,更新还是会使用标签,但不能用于颜色管理。正如评论中指出的那样,标签仅用于以动态可定制的方式从文件内部本地影响
.toc
计数器tocdepth
。要让它们影响颜色之类的东西,就意味着要破解内部etoc
宏。
更简单的方法是用某种方式来告诉etoc
现在停止当前目录。似乎还没有实现这样的功能,因此我不得不这样做(通过\cfr@removetonil
、\AtEndDocument
钩子和中的代码\maintoc
)。
颜色的管理更简单,我们只需要在文件中存储.toc
一些数字,并将其值与文档中要显示彩色目录的位置的当前值进行比较。
标准类样式对于坚持重置页码颜色的部分感到烦恼,我通过局部重新定义来解决这个问题,但这\normalcolor
有点残酷。
\documentclass[oneside,openany]{book}% made oneside/openany just to reduce pages in test file - actual use case is double-sided
\usepackage{etoc,xparse,xcolor}
\makeatletter
\newcounter{packetcount}
\setcounter{packetcount}{1}
\NewDocumentCommand\packetpart {}{%
\clearpage
\thispagestyle{empty}%
\stepcounter{packetcount}%
Title page goes here
\clearpage\thispagestyle{empty}\cleardoublepage
\addtocontents {toc}{\protect\cfr@toccolormanager {\arabic{packetcount}}}%
\tableofcontents
\clearpage\thispagestyle{empty}\cleardoublepage
}
\def\cfr@nil {}
\long\def\cfr@removetonil #1\cfr@nil {}
\newcommand*\cfrtoccolormanager [1]{%
\ifnum #1<\value{packetcount}\color{fadedtoc}%
\else\ifnum #1=\value{packetcount}\color{ontoc}\else
\expandafter\expandafter\expandafter\cfr@removetonil\fi\fi }
\AtBeginDocument {\addtocontents{toc}{\protect\cfr@toccolormanager {1}}}
\AtEndDocument {\addtocontents{toc}{\protect\cfr@nil }}
\newcommand*\maintoc {\let\cfr@toccolormanager\@gobble
\tableofcontents
\let\cfr@toccolormanager\cfrtoccolormanager
% this awful thing next is because of disputable habit of the standard
% classes to reset the color when printing the page numbers (and
% only the page numbers!) in the toc, for the sections, but not
% the chapters... this is less drastic than redefining \addcontentsline
% which would have then to be made compatible with hyperref!
%
% full usage of etoc would go with a customization of the toc line
% styles, hence the problem would not even exist.
\renewcommand*\etocaftertitlehook{\let\normalcolor\relax}%
}
\makeatother
\colorlet{toccol}{black}
\colorlet{fadedtoc}{yellow}% just for clarity in the example
\colorlet{ontoc}{blue}% just for clarity in the example
\begin{document}
Main title page goes here.
\maintoc
\chapter{Chapter One}
\section{A section}
\section{Another section}
\packetpart
\chapter{Chapter Two}
\section{A middle section}
\section{Another middle section}
\packetpart
\chapter{Chapter Three}
\section{A later section}
\end{document}
抱歉,这些透明图像上出现了黄色:
这是使用 etoc 所谓标签的方法。颜色管理如上所述。代码更简单,我们不需要定义分隔宏,也不必在文件末尾放置一些标记.toc
。我将解决页码颜色问题的方法留给用户自己决定:我认为tocloft
可以完全控制,当然etoc
也可以,但必须定义线条样式。在这里,一切都按照类默认值进行。
为了简单起见,这件事并不是完全自动化的:请参阅定义以\maintoc
了解需要manual
做的事情。
注意:在下面的一条评论中,我给出了关于 的错误指示\etocsettagdepth
。正确的做法是在此处将其第二个参数设置为all
(或至少section
) 而不是chapter
。请参阅代码。
\documentclass[oneside,openany]{book}% made oneside/openany just to reduce pages in test file - actual use case is double-sided
\usepackage{etoc,xparse,xcolor}
\makeatletter
\newcounter{packetcount}
\setcounter{packetcount}{1}
\NewDocumentCommand\packetpart {}{%
\clearpage
\thispagestyle{empty}%
\stepcounter{packetcount}%
Title page goes here
\clearpage\thispagestyle{empty}\cleardoublepage
\etocdepthtag.toc {packet\arabic{packetcount}}%
% next is to show all sections, subsections... of the next chapter,
% up to the level restrained by the global tocdepth setting:
\etocsettagdepth {packet\arabic{packetcount}}{all}%
\addtocontents {toc}{\protect\cfr@toccolormanager {\arabic{packetcount}}}%
\tableofcontents
\clearpage\thispagestyle{empty}\cleardoublepage
}
\newcommand*\cfrtoccolormanager [1]{%
\ifnum #1<\value{packetcount}\color{fadedtoc}%
\else\ifnum #1=\value{packetcount}\color{ontoc}\fi\fi }
\AtBeginDocument {\addtocontents{toc}{\protect\cfr@toccolormanager {1}}}
\newcommand*\maintoc {\let\cfr@toccolormanager\@gobble
\tableofcontents
\let\cfr@toccolormanager\cfrtoccolormanager
\etocsettagdepth {packet2}{none}%
\etocsettagdepth {packet3}{none}%
\etocsettagdepth {packet4}{none}%
% repeat with until the last packet
}
\makeatother
\colorlet{toccol}{black}
\colorlet{fadedtoc}{green}% just for (more) clarity in the example. yellow=yuck!
\colorlet{ontoc}{blue}% just for clarity in the example
\begin{document}
Main title page goes here.
\maintoc
\chapter{Chapter One}
\section{A section}
\section{Another section}
\packetpart
\chapter{Chapter Two}
\section{A middle section}
\section{Another middle section}
\packetpart
\chapter{Chapter Three}
\section{A later section}
\section{Another later section}
\packetpart
\chapter{Chapter Four}
\section{An almost latest section}
\section{A latest section}
\end{document}