什么触发 latexmk 调用 makeglossaries?

什么触发 latexmk 调用 makeglossaries?

我已开始使用 make-glossaries 包,并正在创建多个词汇表。不幸的是,我的 latexmk 调用似乎跳过了调用 makeglossaries,所以我的构建没有结束。我使用的是非main-type 词汇表,其中:

\newglossary[nlg]{notation}{not}{ntn}{Notation and Abbreviations}

我运行来构建文档的命令行是:

latexmk -pdf -outdir=aux/ -auxdir=aux/ -pdflatex="xelatex -shell-escape %O %S" my_doc

如果我调用它,latexmk 的控制台输出的结尾是:

Output written on aux/my_doc.pdf (37 pages).
Transcript written on aux/my_doc.log.
Latexmk: Examining 'aux/my_doc.log'
=== TeX engine is 'XeTeX'
Latexmk: Found input bbl file 'aux/pubinfo.bbl'
Latexmk: Missing input file: 'my_doc.not' from line
  'No file my_doc.not.'
Latexmk: Found input bbl file 'aux/my_doc.bbl'
Latexmk: Found input bbl file 'aux/pubinfo.bbl'
Latexmk: Log file says output to 'aux/my_doc.pdf'
Latexmk: Found bibliography file(s) [front/pubinfo.bib]
Latexmk: Found bibliography file(s) [back/general.bib]
Latexmk: All targets (aux/my_doc.pdf) are up-to-date

现在,我已读到:

如何让 Latexmk 使用 makeglossaries?

.latexmkrc建议的文件不是我需要的:

add_cus_dep('glo', 'gls', 0, 'makeglo2gls');
sub makeglo2gls {
    system("makeindex -s '$_[0]'.ist -t '$_[0]'.glg -o '$_[0]'.gls '$_[0]'.glo");
}

它使用makeindex而不是makeglossaries;并且需要每个词汇表文件类型的依赖项。我可以用更合适的东西替换它,这实际上确实会导致 makeglossaries 工作吗?此外,它是否适合使用 subdir aux/

如果没有,我该怎么做才能触发 makeglossaries 的执行?


笔记:

为了“半手动”完成处理,我在第一个 latexmk 调用后添加了以下命令:

makeglossaries -d aux/ my_doc
rm aux/my_doc.pdf
latexmk -pdf -outdir=aux/ -auxdir=aux/ -pdflatex="xelatex -shell-escape %O %S" my_doc

...然后一切都顺利进行。但如果不删除 .pdf,它仍然不起作用(!)

答案1

您提到的.latexmkrc文件建议已过时。请参阅文件glossary_latexmkrc中的example_rcfiles最新建议。根据该文件的内容,您需要放入文件的代码.latexmkrc

add_cus_dep( 'acn', 'acr', 0, 'makeglossaries' );
add_cus_dep( 'glo', 'gls', 0, 'makeglossaries' );
add_cus_dep( 'ntn', 'not', 0, 'makeglossaries' );
$clean_ext .= " acr acn alg glo gls glg ist not ntn";

sub makeglossaries {
    my ($base_name, $path) = fileparse( $_[0] );
    pushd $path;
    my $return = system "makeglossaries", $base_name;
    popd;
    return $return;
}

没有简单的方法可以说服您latexmk了解符号词汇表文件的扩展名,因此您必须添加适当的自定义依赖项。但您不需要为此添加新的子程序。

上述代码在使用辅助目录时也能正常工作。这是通过 和pushd的技巧实现的popd

我还添加了一行来指定在清理时要删除词汇表文件。

答案2

将@JohnCollins 的回答改编为对链接问题的回答中的一些观察:

  • 传播静默模式
  • 为防止出现空格或其他名称异常,请用双引号括起文件名。
  • 更好地(?)支持不同的输入和输出目录<-不确定这是否真的有意义,请随意评论
  • 不要忽略添加到生成的扩展集中
add_cus_dep( 'acn', 'acr', 0, 'run_makeglossaries' );
add_cus_dep( 'glo', 'gls', 0, 'run_makeglossaries' );
add_cus_dep( 'ntn', 'not', 0, 'run_makeglossaries' );

push @generated_exts, 'glo', 'gls', 'glg';
push @generated_exts, 'acn', 'acr', 'alg';
push @generated_exts, 'ntn', 'not', 'nlg';

$clean_ext .= " acr acn alg glo gls glg ist not ntn";

sub run_makeglossaries {
    my $dir = dirname($_[0]);
    my $base_name = basename($_[0]);

    my $return;
    if ( $silent ) {
        $return = system "makeglossaries", "-q", "-d", "$dir", "$base_name";
    }
    else {
        $return = system "makeglossaries", "-d", "$dir", "$base_name";
    };
    return $return;
}

相关内容