目录排序

目录排序

我想知道是否有办法按章节名称对目录进行排序。

例如实际的表格如下所示:

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。这将组织您的目录。

相关内容