如何确定何时重新运行 makeglossaries?

如何确定何时重新运行 makeglossaries?

和索引一样,对于词汇表,latex 也会创建一个原始索引/词汇表,然后运行外部排序工具 makeindex 或 makeglossaries,再运行一次 latex,将排序后的索引/词汇表包含到 tex 中。问题是,不仅必须重新运行 latex 才能获得正确的结果,有时还必须重新运行 makeindex。

对于索引,imakeidx 包似乎提供了一个解决方案,其中包括对 latex 运行进行排序,因此不需要显式运行 makeindex。问题:这如何也用于词汇表???

谢谢你的帮助!!!

答案1

包选项automake使用 shell escape 来生成外部文件。这类似于imakeidx的自动功能。

解决您的评论:

您写道,它可能不适用于 xindy。为什么呢?

如果您打开了不受限制的 shell 转义,则该automake选项可以使用,但如果打开了受限模式(通常是大多数 TeX 发行版的默认设置),则无法使用。被视为受信任的应用程序,可以在受限模式下通过 shell 转义运行,但不在受信任的列表中,因此它需要不受限制的 shell 转义。(这也适用于。)xindymakeindexxindyimakeidxxindy

如果你查看该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一直被考虑纳入可信列表,但是有一个安全查询阻止了它的添加。

另一个问题是,您必须确保按照 的要求准确设置语言和代码页xindymakeglossaries脚本将已知的语言标签映射babel到 所需的适当标签xindy。例如,如果您有

\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
\usepackage[xindy]{glossaries}

然后从文件中makeglossaries获取语言标签,但知道需要将其映射到。脚本可以获取编码,但由于文档中未指定包含或或 的代码页,因此脚本还会添加编码。该选项没有这种复杂程度,只会尝试,但这不会起作用。ngerman.aux-L germanmakeglossariesuft8din5007din5007dudenbrailleautomake-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包含din5007duden之一braille);

  • 如果出现问题,脚本makeglossaries会分析记录文件,并尝试提供更易于理解的消息,因为某些消息(尤其是来自的消息xindy)非常隐晦;

  • makeglossaries脚本可以纠正一些问题。特别是它可以检测makeindex“多重封装”警告并尝试修复该问题。

与使用 TeX 相比,使用脚本语言(例如 Perl)完成这些任务要容易得多,而且效率更高。

我如何才能知道是否必须在 makeindex 运行后重新运行 latex?

您将始终需要在之后运行 LaTeX,makeindex因为它会创建由(或)makeindex读取的文件。这与 相同。\printglossary\printglossariesimakeidx

如果页码在构建之间发生变化,则可能需要额外的makeindex/运行。例如,包含一个在前言开头未重置页码的目录,可能会导致索引页码发生变化。 也会出现此问题。xindyimakeidx

需要重建词汇表文件的另一种情况是,如果词汇表中的某个条目仅被另一个条目引用。最常见的情况是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}

步骤latexmakeindexlatex仅包括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}

这意味着只有latexmakeindexlatex是必需的。

文件图像

相关内容