如何让 Latexmk 使用 makeglossaries?

如何让 Latexmk 使用 makeglossaries?

有没有办法乳胶调用makeglossaries(部分词汇表包裹)?

具体来说,我想使用 latexmk 编译一个使用该glossaries包生成词汇表的 LaTeX 文档。目前,我正在使用这个相当笨拙的命令序列:

makeglossaries document
latexmk -pdf document.tex
makeglossaries document
latexmk -pdf document.tex

第一次运行 makeglossaries 需要生成glossaries包所需的文件,否则会导致 latexmk 失败,但(不存在的).aux 文件中仍然没有数据,因此第一次 makeglossaries 调用不会产生任何内容(除了一个空文件)。

那么,如何单独使用 latexmk 来做到这一点(并让它在正确的时间调用 makeglossaries)?

答案1

您需要编写一个配置文件,告诉 latexmk 哪些文件对词汇表有用以及如何处理它们。幸运的是,作者提供了一些示例 rc 文件

推杆

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

~/.latexmkrc(您的主目录中全局)或./latexmkrc(在您的文档目录中本地)应该可以解决问题。

答案2

应 Hans-Peter E. Kristiansen 的要求,我提供了另一个答案,扩展了 kay102 给出的答案。

将以下行添加到某些latexmk初始化文件中(例如,在 Linux 系统上~/.latexmkrc):

add_cus_dep('glo', 'gls', 0, 'run_makeglossaries');
add_cus_dep('acn', 'acr', 0, 'run_makeglossaries');

sub run_makeglossaries {
    my ($base_name, $path) = fileparse( $_[0] ); #handle -outdir param by splitting path and file, ...
    pushd $path; # ... cd-ing into folder first, then running makeglossaries ...

    if ( $silent ) {
        system "makeglossaries -q '$base_name'"; #unix
        # system "makeglossaries", "-q", "$base_name"; #windows
    }
    else {
        system "makeglossaries '$base_name'"; #unix
        # system "makeglossaries", "$base_name"; #windows
    };

    popd; # ... and cd-ing back again
}

因此,如果latexmk使用该-silent选项调用makeglossaries,也将保持静默。

此外,添加

push @generated_exts, 'glo', 'gls', 'glg';
push @generated_exts, 'acn', 'acr', 'alg';
$clean_ext .= ' %R.ist %R.xdy';

适当更新清理功能latexmk

答案3

您还可以通过将以下内容添加到 latexmkrc 文件中来让 latexmk 直接调用 makeglossaries(在我的情况下,我必须将其添加到 $HOME/.latexmkrc):

add_cus_dep('glo', 'gls', 0, 'makeglossaries');
add_cus_dep('acn', 'acr', 0, 'makeglossaries');

sub makeglossaries {
    system "makeglossaries $_[0]";
    if ( -z "$_[0].glo" ) {
        open GLS, ">$_[0].gls";
        close GLS;
    }
    return 0;
}

答案4

我的源文件和生成的文件位于不同的目录中。运行 mhp 的解决方案时,我收到错误:(需要“doc.xdy”) 错误:找不到文件“doc.xdy”。然后我将解决方案扩展为:

file: conf/glossaries.latexmk
-----------------------------
print("LATEXMK: Glossaries Módule...\n");

use File::Basename;

add_cus_dep('glo', 'gls', 0, 'run_makeglossaries');
add_cus_dep('acn', 'acr', 0, 'run_makeglossaries');

sub run_makeglossaries {
   $dir = dirname($_[0]);
   $file = basename($_[0]);
   if ( $silent ) {
      system "makeglossaries -q -d '$dir' '$file'";
   }
   else {
      system "makeglossaries -d '$dir' '$file'";
   };
}

push @generated_exts, 'glo', 'gls', 'glg';
push @generated_exts, 'acn', 'acr', 'alg';
$clean_ext .= ' %R.ist %R.xdy';

然后我运行:

cd src
latexmk \
  -f -pdf -bibtex-cond \
  -r "../conf/glossaries.latexmk" \
  -auxdir=../.build -outdir=../.build \
  -pdflatex="xelatex -interaction=nonstopmode -synctex=1 %O %S" doc

相关内容