在我的回答中这个问题如何制作latexmk
使用makeglossaries
为了生成词汇表,我建议以下自定义依赖项:
add_cus_dep('glo', 'gls', 0, 'run_makeglossaries');
add_cus_dep('acn', 'acr', 0, 'run_makeglossaries');
sub run_makeglossaries {
if ( $silent ) {
system "makeglossaries -q '$_[0]'";
}
else {
system "makeglossaries '$_[0]'";
};
}
何时latexmk
在 LaTeX 输入文件上运行
\documentclass{article}
\usepackage[acronym]{glossaries}
\newglossaryentry{test}{name={Test}, description={A Test}}
\newacronym{AT}{AT}{A Test}
\makeglossaries
\glsaddall
\begin{document}
\printglossaries
\end{document}
这第一次它按顺序调用latex
、makeglossaries
和。这是意料之中的,因为在一次调用中处理所有定义的词汇表(这里是主词汇表和首字母缩略词列表)。latex
makeglossaries
现在,假设我对两个都术语test
和首字母缩略词AT
(例如,我将其转换Test
为小写)。然后,发出的命令序列latexmk
是latex
,,makeglossaries
和。因此,被调用两次makeglossaries
,而调用一次就足够了。latex
makeglossaries
因此,我想知道:是否有可能改进我的自定义依赖项,以便latexmk
正确处理前面的情况?
答案1
两次运行makeglossaries
是因为 的不足latexmk
。问题在于自定义依赖项被认为只有一个输入文件和一个输出文件。但makeglossaries
每个词汇表都有一个输入文件和一个输出文件;在给出的示例中,输入文件的扩展名为acn
和glo
,输出文件的扩展名为acr
和gls
。
需要对 进行大量重写latexmk
才能改善这种情况。我怀疑 的额外运行所产生的额外运行时间makeglossaries
通常与 本身的运行时间相比相当低latex
,因此这对我来说不是修复此问题的首要任务。
或者,您可以重写自定义依赖项的定义以直接运行,makeindex
而不是将其委托给makeglossaries
。
所发生的情况是,latexmk
正如预期的那样,创建了两个自定义依赖项:对于acn
to acr
,以及对于glo
to gls
。当对两个词汇表进行更改时,latexmk
会发现两个规则都已过期并运行makeglossaries
。因此两次运行是预期的。
但这留下了一个谜题:为什么makeglossaries
第一次处理源文件时只运行一次latexmk
。这是因为从初始设置开始,latexmk
第一次运行makeglossaries
以创建gls
文件。作为副作用,这也会创建文件acr
。现在在初始运行时,latexmk
看到文件acr
比文件更新acn
,因此它不必费心制作它。但在后续运行中,latexmk
使用文件内容更改的标准而不是输入和输出文件之间的相对文件时间来确定是否重新制作输出文件。因此,第一次运行只makeglossaries
完成了一次运行。
补充说明:
我提到,自定义依赖项可以以不同的方式编写,以makeindex
直接调用,而不是将其委托给makeglossaries
。这可以优化运行次数。以下是其中一种方法:
add_cus_dep('glo', 'gls', 0, 'run_makeindex');
add_cus_dep('acn', 'acr', 0, 'run_makeindex');
sub run_makeindex {
my $source = $$Psource;
my $dest = $$Pdest;
my $log = $dest."LOG";
my $cmd = "makeindex %O -s \"$_[0].ist\" -t \"$log\" -o \"$dest\" \"$source\"";
if ($silent) { $cmd =~ s/%O/-q/; }
else { $cmd =~ s/%O//; }
return system $cmd;
}
为了使代码更简单,并使两种情况的代码相同,我使用了几个内部变量latexmk
来指定依赖项的源文件和目标文件。我将日志文件的名称设置为makeindex
比 更容易创建的名称makeglossaries
。