我想知道是否有办法按章节名称对目录进行排序。
例如实际的表格如下所示:
Toc:
x .... 2
d .... 3
a .... 5
但我希望看到的是:
Toc:
a .... 5
d .... 3
x .... 2
我通过调用将条目添加到目录中
\addcontentsline{toc}{section}{a}
但如果需要的话我可以改变它。
根据评论中的要求进行更新:我需要生成几个(大约 200 个)页面,这些页面由来自数据库(如列表)的脚本填充,对于每个条目,我都会制作一个带有一些框的页面,并通过调用 addcontentsline 将该项目的本地名称添加到目录中,并假装它是一个部分(它不是,也不应该在那里看起来是一个部分,但部分的功能很有用)。由于它看起来只符合预期,我开始添加一些代码以将更多条目(列表中的每个项目至少有两个名称:一个科学名称和一个通用名称)添加到第二个假目录中。现在我需要对我的两个表进行排序。因为我的“书”需要有两个目录:一个用于科学名称,一个用于通用名称
\usepackage{titletoc}
\usepackage{tocloft}
\newcommand{\listexamplename}{Other Name}
\newlistof{example}{exp}{\listexamplename}
\newcommand{\example}[1]{%
\refstepcounter{example}
\addcontentsline{exp}{example}
{\protect{}#1}\par}
如果您认为最好使用其他方法,请向我指出代码,我不确定归档此内容的“正确”方法是什么。为了使其更加复杂,我想我稍后会将按类别排序的项目移到子部分中。因此,“将其保留在目录中”的想法以前看起来最有希望。但现在我不再确定了。
答案1
可以使用etoc
+l3sort
来实现这一点。然而最简单的方法是对第一次传递时生成的文件副本进行排序,.toc
例如在 Emacs 缓冲区中排序(或通过 unix 命令行工具自动执行),创建文件foosorted.toc
。然后你只需要输入文件。例如
\documentclass{article}
\begin{document}
\IfFileExists{\jobname sorted.toc}{{\csname c@tocdepth\endcsname -1 \tableofcontents}\input{\jobname sorted.toc}}{\tableofcontents}
\addcontentsline{toc}{section}{Z}
\addcontentsline{toc}{section}{A}
\addcontentsline{toc}{section}{D}
\addcontentsline{toc}{section}{C}
\end{document}
编辑以强制打开写入流以便\addcontentsline{toc}
实际工作(使用 etoc 包中的工具会更容易)
并且不要使用,\section
因为编号当然会破坏排序
实际上,您可以使用\addcontentsline{bar}{section}{...}
来操作\jobname.bar
和\jobname sorted.bar
例如。但随后您需要手动打开写入流之\tf@bar
类的操作,使其独立于常规\tableofcontents
。
上述方法的问题在于实现。每次添加新部分后,您都必须重新进行排序。或者等待最后阶段。或者使用 shell-escape 将文件添加到sort
允许的二进制文件列表中。
答案2
如果您使用 latexmk,您可以在规则中调用一个 Python 脚本,该脚本读取由 latex 编译器生成的文件并对内容进行排序。
这是我用来完成此任务的脚本:
#!/usr/bin/python
# -*- coding: utf-8 -*-
'''
Esse script organiza uma lista latex (toc) em ordem alfabética.
Ncessário indicar o do arquivo com a lista na variável filename.
'''
filename = 'path to resulted toc file after a compile sequence'
with open(filename) as f:
content = f.readlines()
with open(filename, 'w') as f:
for i in sorted(content):
f.write(i)
您唯一需要做的就是在变量 filename 中指定要排序的列表文件的路径。此文件通常命名为 [主 tex 文件名].[定义的 toc 名称]。脚本将打开文件、读取行、按字母顺序对行进行排序,然后将内容保存在同一文件中。
您可以在 Makefile 中调用 latexmk 之后立即调用它。
这是我在 Makefile 中的主要规则:
latexmk -pdf -pdflatex="pdflatex -interactive=nonstopmode" -use-make $< && sort_list.py && pdflatex $(PROJNAME).tex
sort_list.py 是我给该脚本起的名字。
如果您不使用 latexmk,您可以执行编译序列,执行 python 脚本并调用最终的 pdflatex。这将组织您的目录。