您可以使用命令“\addcontentsline”手动声明内容出现的顺序吗?

您可以使用命令“\addcontentsline”手动声明内容出现的顺序吗?

为了简单起见,我为 LaTeX 创建了一个自定义目录,

% ===TOC (Alphabetical)===
% - - - - - - - - - - - - - - - -

    \makeatletter
    \newcommand\tableofcontentsalphabetical{%
        \if@twocolumn
            \@restonecoltrue\onecolumn
        \else
            \@restonecolfalse
        \fi
        \chapter*{%
            \contentsname   \\
            (Alphabetical*)
            \@mkboth{\MakeUppercase\contentsname (Alphabetical*)}
                    {\MakeUppercase\contentsname (Alphabetical*)}%
        }%
        \@starttoc{tocabc}%
        \if@restonecol\twocolumn\fi
    }
    \newcommand{\addtocabc}[2]{%
        \addcontentsline{tocabc}{#1}{\protect\numberline{\csname the#1\endcsname}#2}%
    }
    \makeatother

而且,我想知道是否有一种方法可以声明任何内容出现的顺序,我使用上述命令添加。我不懂 TeX 或 LaTeX,但当我寻找答案并提出问题时,我逐渐明白了。

就我而言,我认为声明条目应按哪个顺序排列会更容易,而不必担心声明页面(如果可以的话)。因为顺序永远不会改变(它是按字母顺序排列的),但页面会改变。

我希望这很清楚。但是,话虽如此,我是否应该放弃关心并手动重新排序*.tocabcLaTeX 创建的相应文件?

我在 Vim 中编写,因此我让 Vim 调用一个脚本来查看文件名的结尾并对其进行适当的编译,因此让它编译文件两三次,然后重新排序该 TOC 文件,然后重新编译它并不难。

先感谢您!

答案1

好吧,如果你手动进行排序,那就相当容易了,你只需要标签:

\documentclass{book}
\begin{document}
\tableofcontents

\chapter*{Alphatical toc}
\makeatletter
\@starttoc{tocabc}
\makeatother

\addtocontents{tocabc}{\protect\contentsline{chapter}{B}{\pageref{B}}{}}
\addtocontents{tocabc}{\protect\contentsline{chapter}{C}{\pageref{C}}{}}
\addtocontents{tocabc}{\protect\contentsline{chapter}{X}{\pageref{X}}{}}

\chapter{C\label{C}}
\chapter{X\label{X}}
\chapter{B\label{B}}

\end{document}

如果您想要超链接,它可能会变得更复杂一些。

答案2

既然你说你是 LaTeX 新手,我希望你先给出一些一般性建议,而不是直接回答问题。首先我要说的是,一般来说,除非你真的是专家,否则你不应该为已经存在的命令定义自定义命令,而是查找有关可能选项的文档。几乎所有真正需要的东西都已经实现了,如果你找不到你想做的事情,那可能不是一个好主意。

当您说“项目的顺序不会改变,但页面会改变”时,我认为您混淆了目录指数。目录应按页码顺序排列,而不是按字母顺序排列,索引则相反。否则可能会让读者感到困惑。(这个问题也在这个 SE 问题

我建议你应该自己记录关于 LaTeX 的makeindex包和命令,例如,维基百科.然后你可以使用:

\usepackage{makeidx} % this goes in the preamble
\makeindex
(...)
\chapter{Zebra}\index{Zebra}
(...)
\chapter{Apple}\index{Apple}
(...)
\printindex
\end{document}

(并且使用makeindex除了(pdf)latex或其他命令,请参阅上面的文档)。

原则上,你可以重新定义 \chapter 命令来避免使用这些\index命令,例如

\let\ochap\chapter \def\chapter#1{\ochap{#1}\index{#1}}

(如果您的标题里面有命令,您可能需要使用\protect;此外,如果您想使用,则\chapter*需要更加小心。)

也就是说,目录中内容的顺序确实是通过命令定义的\addcontentsline,您可以按照 Ulrike 的回答中所示的任何顺序手动将章节添加到自定义目录中。但这要求您手动维护按字母顺序排列的列表,其中包含每个章节标题的副本。避免这种情况的一种方法是重新定义上述命令\chapter以将标题添加到自定义列表中,并使用可用的命令/包(例如datatool)或您自己的代码,如中所述,例如这个答案或者或者或者这个问题,生成一个排序列表。

如果您希望列表位于文档开头,则肯定需要使用辅助文件。因此,您可以使用第二个自定义 TOC 文件,如 Ulrike 的答案中所述,您可以在其中放入制作列表所需的命令,或者更简单,在本地重新定义 TOC 中的常用命令以执行您需要的操作。(如果需要,我可以编辑我的答案以详细说明。)

但我再次认为,按字母顺序排列的内容列表的构建应该留给makeindex

相关内容