和索引一样,对于词汇表,latex 也会创建一个原始索引/词汇表,然后运行外部排序工具 makeindex 或 makeglossaries,再运行一次 latex,将排序后的索引/词汇表包含到 tex 中。问题是,不仅必须重新运行 latex 才能获得正确的结果,有时还必须重新运行 makeindex。
对于索引,imakeidx 包似乎提供了一个解决方案,其中包括对 latex 运行进行排序,因此不需要显式运行 makeindex。问题:这如何也用于词汇表???
谢谢你的帮助!!!
答案1
包选项automake
使用 shell escape 来生成外部文件。这类似于imakeidx
的自动功能。
解决您的评论:
您写道,它可能不适用于 xindy。为什么呢?
如果您打开了不受限制的 shell 转义,则该automake
选项可以使用,但如果打开了受限模式(通常是大多数 TeX 发行版的默认设置),则无法使用。被视为受信任的应用程序,可以在受限模式下通过 shell 转义运行,但不在受信任的列表中,因此它需要不受限制的 shell 转义。(这也适用于。)xindy
makeindex
xindy
imakeidx
xindy
如果你查看该texmf.cnf
文件,你会发现以下注释:
% we'd like to allow:
% dvips - but external commands can be executed, need at least -R1.
% epspdf, ps2pdf, pstopdf - need to respect openout_any,
% and gs -dSAFER must be used and check for shell injection with filenames.
% pygmentize - but is the filter feature insecure?
% ps4pdf - but it calls an unrestricted latex.
% rpdfcrop - maybe ok, but let's get experience with repstopdf first.
% texindy,xindy - but is the module feature insecure?
因此xindy
一直被考虑纳入可信列表,但是有一个安全查询阻止了它的添加。
另一个问题是,您必须确保按照 的要求准确设置语言和代码页xindy
。makeglossaries
脚本将已知的语言标签映射babel
到 所需的适当标签xindy
。例如,如果您有
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
\usepackage[xindy]{glossaries}
然后从文件中makeglossaries
获取语言标签,但知道需要将其映射到。脚本可以获取编码,但由于文档中未指定包含或或 的代码页,因此脚本还会添加编码。该选项没有这种复杂程度,只会尝试,但这不会起作用。ngerman
.aux
-L german
makeglossaries
uft8
din5007
din5007
duden
braille
automake
-L ngerman -C utf8
所以如果想让上面的ngerman
例子正常工作automake
,必须写成:
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}
\usepackage[automake,xindy={language=german,codepage={din5007-utf8}}]{glossaries}
\makeglossaries
\newglossaryentry{foo}{name=foo,description={an example}}
\begin{document}
\gls{foo}.
\printglossaries
\end{document}
如果在受限模式下运行,则不会创建词汇表文件,并且日志文件包含:
runsystem(xindy -I xindy -L german -M test -C din5007-utf8 -t test.glg
-o test.gls test.glo)...disabled (restricted).
(其中文档名为test.tex
。)必须启用 shell 转义:
pdflatex -shell-escape test
该automake
选项被视为最后的手段,因为它缺乏makeglossaries
脚本的复杂性:
LaTeX 代码没有将
babel
语言标签映射到xindy
标签;LaTeX 代码不了解特定语言的特殊情况(例如,模块要求
german
包含din5007
或duden
之一braille
);如果出现问题,脚本
makeglossaries
会分析记录文件,并尝试提供更易于理解的消息,因为某些消息(尤其是来自的消息xindy
)非常隐晦;该
makeglossaries
脚本可以纠正一些问题。特别是它可以检测makeindex
“多重封装”警告并尝试修复该问题。
与使用 TeX 相比,使用脚本语言(例如 Perl)完成这些任务要容易得多,而且效率更高。
我如何才能知道是否必须在 makeindex 运行后重新运行 latex?
您将始终需要在之后运行 LaTeX,makeindex
因为它会创建由(或)makeindex
读取的文件。这与 相同。\printglossary
\printglossaries
imakeidx
如果页码在构建之间发生变化,则可能需要额外的makeindex
/运行。例如,包含一个在前言开头未重置页码的目录,可能会导致索引页码发生变化。 也会出现此问题。xindy
imakeidx
需要重建词汇表文件的另一种情况是,如果词汇表中的某个条目仅被另一个条目引用。最常见的情况是see
使用密钥时。
例如:
\documentclass{article}
\usepackage{glossaries}
\makeglossaries
\newglossaryentry{foo}{name=foo,description={an example}}
\newglossaryentry{bar}{name=bar,description={another
example},see={foo}}
\begin{document}
\gls{bar}.
\printglossaries
\end{document}
步骤latex
,makeindex
,latex
仅包括bar
条目
因为foo
只有在读取词汇表文件并处理该条目后,才能对该条目进行索引。这意味着需要再执行一次makeindex
并运行。latex
或者,如果您使用扩展包,它将在文档末尾glossaries-extra
搜索所有使用的条目的键,如果尚未使用,则自动对其进行索引。see
\documentclass{article}
\usepackage{glossaries-extra}
\makeglossaries
\newglossaryentry{foo}{name=foo,description={an example}}
\newglossaryentry{bar}{name=bar,description={another
example},see={foo}}
\begin{document}
\gls{bar}.
\printglossaries
\end{document}
这意味着只有latex
、makeindex
和latex
是必需的。