我对 latexmk 的自定义依赖可以改进吗?

我对 latexmk 的自定义依赖可以改进吗?

在我的回答中这个问题如何制作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}

第一次它按顺序调用latexmakeglossaries和。这是意料之中的,因为在一次调用中处理所有定义的词汇表(这里是主词汇表和首字母缩略词列表)。latexmakeglossaries

现在,假设我对两个都术语test和首字母缩略词AT(例如,我将其转换Test为小写)。然后,发出的命令序列latexmklatex,,makeglossaries和。因此,被调用两次makeglossaries,而调用一次就足够了。latexmakeglossaries

因此,我想知道:是否有可能改进我的自定义依赖项,以便latexmk正确处理前面的情况?

答案1

两次运行makeglossaries是因为 的不足latexmk。问题在于自定义依赖项被认为只有一个输入文件和一个输出文件。但makeglossaries每个词汇表都有一个输入文件和一个输出文件;在给出的示例中,输入文件的扩展名为acnglo,输出文件的扩展名为acrgls

需要对 进行大量重写latexmk才能改善这种情况。我怀疑 的额外运行所产生的额外运行时间makeglossaries通常与 本身的运行时间相比相当低latex,因此这对我来说不是修复此问题的首要任务。

或者,您可以重写自定义依赖项的定义以直接运行,makeindex而不是将其委托给makeglossaries

所发生的情况是,latexmk正如预期的那样,创建了两个自定义依赖项:对于acnto acr,以及对于gloto 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

相关内容