使用纯 TeX 创建我自己的 \tableofcontents

使用纯 TeX 创建我自己的 \tableofcontents

我想用 TeX(不是 LaTeX,所以没有软件包)定义自己的目录,以便对目录的内容、数字的显示方式等进行精细控制。基本上,我想要编写一个如下所示的文件

1.0.0.Title of chapter 1
1.1.0.Title of section 1
1.1.1.Title of subsection 1.1
1.1.2.Title of subsection 1.2
2.0.0.Title of chapter 2
A.0.0.Title of appendix A

并使用以下选项阅读:

  • 编写仅包含章节的目录
  • 编写仅包含第 1 章及其章节的目录
  • ...

为此我有两个问题:

  1. 我怎样才能(重新)写入特定行中的某些内容以保持文件排序?(例如,如果在第二次编译后我更改了第 2 章的标题并在第 1 章中添加了小节 1.3,我该如何更新我的文件?)
  2. 如何处理\read这个文件?我是 TeX 中文件写入/读取方面的新手,所以我不知道是否需要注意什么或是否有特殊的方法来做到这一点?

考虑到我的问题,如果文件写在模板中,问题 2 可能就很简单了

\toccontent{1}{0}{0}{Title of chapter 1}
...

因此,它只需要根据我想要显示的内容和方式\input重新定义后再进行 ted (例如“如果第二个参数不是 0,则不执行任何操作”)。\toccontent

答案1

使用eplain宏,您可以写入.toc文件并读取结果。命令(例如)\writenumberedtocentry在 toc 文件中生成以 开头的行\tocchapterentry。因此,您需要定义命令\tocchapterentry\tocsectionentry以格式化/处理读入的材料。

这是一个非常基本的文档示例,其中包含两个版本的目录,对于同一个 toc 文件,第二个版本仅包含章节。

示例输出

\input eplain

\newif\ifchaponlytoc
\chaponlytocfalse

\def\tocchapterentry#1#2#3{{\bf #2 #1 page #3}\par}
\def\tocsectionentry#1#2#3{\ifchaponlytoc\else#2 #1 page #3\par\fi}

\newcount\chapno
\newcount\secno
\newcount\subsecno

\chapno=0\secno=0\subsecno=0

{\bf Table of Contents}
\smallskip

\readtocfile

\bigskip

{\bf Table of Chapters}
\smallskip

\chaponlytoctrue
\readtocfile

\bigskip

\advance\chapno by 1\secno=0\subsecno=0
\xdef\fullchapno{\the\chapno .\the\secno .\the\subsecno}
{\bf \the\chapno\ First Chapter}
\writenumberedtocentry{chapter}{First Chapter}{\fullchapno}

Text of first chapter.

\medskip
\advance\secno by 1\subsecno=0
\xdef\fullchapno{\the\chapno .\the\secno .\the\subsecno}
{\it \the\chapno.\the\secno\ First Section}
\writenumberedtocentry{section}{First Section}{\fullchapno}

Text of first section.

\bigskip

\advance\chapno by 1\secno=0\subsecno=0
\xdef\fullchapno{\the\chapno .\the\secno .\the\subsecno}
{\bf \the\chapno\ Second Chapter}
\writenumberedtocentry{chapter}{Second Chapter}{\fullchapno}

Text of second chapter.

\bye

在文档正文中,每个章节、节等都会更新其计数器、定义\fullchapno并将信息写入 toc 文件。请注意,\writenumberedtocentry最后一个参数只会扩展其第一个术语,因此\fullchapno需要包含扩展的章节号。

现在,我们在文档顶部引入了一个切换按钮,\ifchaponlytoc以确定我们是否只希望在目录中显示章节,还是希望在所有级别中显示章节。较低级别的目录打印命令会先测试此切换按钮,然后再决定是否输出任何内容。另一种方法是,在第二次读取目录文件之前,简单地以不同的方式定义这些命令。

当然,上面的大部分代码都可以打包成宏,但很多细节也取决于你如何设置分段命令以及如何将条目添加到目录中。我希望这能给你一个开始的想法。看看eplain文档了解更多信息。

答案2

titletoc包提供了您所需要的内容,特别是printcontents可以使用它的命令。

printcontents命令具有语法

\printcontents[name]{prefix}{start-level}{toc-code}

我在下面的代码中以两种方式使用了它:

\startcontents[chapters]
...
...
% prints only chapters
\printcontents[chapters]{}{0}{
% locally set the tocdepth for *this* printing of the toc
\setcounter{tocdepth}{0}
}

这将仅打印出您的章节文件,因为我已将其设置tocdepth0本地。

我也用过

\startcontents[zebras]
\chapter{zebras}
% prints this chapter and its sections
\printcontents[zebras]{}{0}{
% locally set the tocdepth for *this* printing of the toc
\setcounter{tocdepth}{1}
}
\section{}
\lipsum
\section{}
\section{}
\stopcontents[zebras]

仅此minitoc而已。如果您希望在此部分中包含其他标题级别,则chapter可以在本地增加。tocdepthtoc

下面是一个完整的 MWE,它演示了这个想法。如果以后想阅读,请查阅文档;你也可能对以下内容感兴趣:minitoc提供一些类似功能的包。

% arara: pdflatex
% !arara: indent: {overwrite: yes}
\documentclass{report}
\usepackage{titletoc}   % customize tableofcontents
\usepackage{lipsum} % sample text

% the printcontents command is from the titletoc package
% and it has the form
%
% \printcontents[name]{prefix}{start-level}{toc-code}
\begin{document}

% start partial toc for the chapters
\startcontents[chapters]

% start partial toc for this chapter- call it zebras, for example
\startcontents[zebras]
\chapter{zebras}
% prints this chapter and its sections- adjust the tocdepth
% to get deeper headings such as subsection, etc
\printcontents[zebras]{}{0}{
    % locally set the tocdepth for *this* printing of the toc
    \setcounter{tocdepth}{1}
}
\section{}
\lipsum
\section{}
\section{}
\stopcontents[zebras]

% new chapter
\chapter{}
\section{}
\section{}
\section{}
\lipsum

% prints only chapters by setting the tocdepth locally
\printcontents[chapters]{}{0}{
    % locally set the tocdepth for *this* printing of the toc
    \setcounter{tocdepth}{0}
}
\end{document}

答案3

对于第一个问题,您只需编译两次:第一次修改.toc 文件,第二次将其合并到 pdf 或 dvi 中。

要编写仅包含章节的目录,请写入:

\setcounter{\tocnumdepth}{0} \tableofcontents  

titletoc 包(包含在 titlesec 中,但可以单独使用)允许您自定义目录,并允许使用特定命令使用部分目录(/figures/tables):

\startcontents, \stopcontents, \resumecontents and \printcontents

详细信息请参阅 titlesec 文档第 6.3 至 6.5 节

相关内容