有没有办法乳胶调用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