考虑以下latexmkrc
配置文件(比如latexmkrc.tex
),其中包含一个自定义依赖项,该依赖项应该在文件相对于相应的源文件过期texindy
时运行子例程:.ind
# $makeindex = 'texindy'; #$
add_cus_dep('idx', 'ind', 0, 'texindy');
sub texindy{
system("texindy \"$_[0].idx\""); #$
}
$pdf_mode = 1; #$
现在,考虑一个.tex
文件(比如test.tex
),使用以下命令进行处理:
latexmk -g -norc -r latexmkrc.tex test
在哪里:
-g
强制latexmk
完全处理文档的选项(仅用于示例),-norc
选项只是为了确保没有其他latexmk
配置文件latexmkrc.tex
被考虑。
然后,会发生以下情况:
- 跑步
pdflatex -recorder "test.tex"
。 - 跑步
makeindex -o "test.ind" "test.idx"
。 - 跑步
pdflatex -recorder "test.tex"
。
问题在于步骤#2,latexmk
即创建新规则:
=== Creating rule for 'cusdep idx ind test'
Latexmk: applying rule 'makeindex test.idx'...
Rule 'makeindex test.idx': File changes, etc:
Non-existent destination files:
'test.ind'
------------
Run number 1 of rule 'makeindex test.idx'
------------
------------
Running 'makeindex -o "test.ind" "test.idx"'
忽略其中的自定义依赖项和子程序latexmkrc.tex
应该会导致:texindy -o "test.ind" "test.idx"
相反。
解决方法是,可以注释掉以下行
# $makeindex = 'texindy'; #$
但latexmkrc.tex
我仍然感到困惑:为什么latexmk
忽略我的(索引)自定义依赖和子程序?
最小完整示例:
\documentclass{article}
\usepackage[xindy]{imakeidx}
\usepackage{filecontents}
\makeindex
\begin{filecontents*}{latexmkrc}
# $makeindex = 'texindy'; #$
add_cus_dep('idx', 'ind', 0, 'texindy');
sub texindy{
system("texindy \"$_[0].idx\""); #$
}
$pdf_mode = 1; #$
\end{filecontents*}
\begin{document}
Foo\index{Foo}
\printindex
\end{document}
答案1
您有两个规则可用于.ind
从文件创建文件.idx
:内置 makeindex 规则和自定义依赖项。 Latexmk
必须选择哪个。它的编程方式是,它首先找到内置规则,因此这就是所用的。
正如您所注意到的,要使用,texindy
您需要重新定义$makeindex
,方法是
$makeindex = 'texindy';
或者(稍微好一点)
$makeindex = 'texindy %O -o %D %S';