为什么 latexmk 会忽略我的(索引)自定义依赖项和子程序?

为什么 latexmk 会忽略我的(索引)自定义依赖项和子程序?

考虑以下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被考虑。

然后,会发生以下情况:

  1. 跑步pdflatex -recorder "test.tex"
  2. 跑步makeindex -o "test.ind" "test.idx"
  3. 跑步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';

相关内容