显示本地目录时自动调整当前部分的颜色

显示本地目录时自动调整当前部分的颜色

我用复印机制作教材。但是,复印机最多只能装订 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 部分的内容如下:

第 2 部分的内容

.toc但是,所有其他部分的内容都与第 2 部分的内容一样,因为我已经在特定点将颜色变化写入文件,并且\tableofcontents无论哪个部分是当前活动的部分,都会读取相同的代码。

这意味着我必须手动移动\tocon\tocoff命令才能生成书中的不同部分,并且每次都必须重新编译文件两次。例如,要生成第三部分,我必须删除命令\tocon\tocoff用 替换命令\tocon,然后重新编译两次才能正确解析所有内容。这很麻烦。

我希望使用etoc来避免这种情况。具体来说,我希望在 中施展一些魔法,以所需的方式修改书中该部分\packetpart的显示。 的一个吸引力在于它确实\tableofcontentsetoc不是需要额外的辅助文件,其中我已经写了很多。

我已经想出了如何避免\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 部分的内容:

第 2 部分的内容(带标签)

第 3 部分:

第 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}

抱歉,这些透明图像上出现了黄色:

目录主页


目录 2
目录 3



这是使用 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}

主页


目录 2


目录 3


目录 4

相关内容