考虑一个test1.tex
包含(单个)索引的文件,该文件应具有特殊的布局,并且应使用特定的样式(例如
index.xdy
)。这可以通过以下过程完成:
pdflatex test1
texindy -M index.xdy test1.idx
pdflatex test1
可以通过以下方式实现自动化latexmk
:
latexmk -norc -r latexmkrc1.tex test1
在哪里:
-norc
选项只是为了确保没有其他latexmk
配置文件被latexmkrc1.tex
考虑,latexmkrc1.tex
文件是:$makeindex = 'texindy -M index.xdy'; $pdf_mode = 1; #$
到目前为止,一切都很好。
现在,考虑一个test2.tex
包含多个(比如两个)索引的文件,这些索引应该具有不同的布局,并且应该使用不同的样式(比如indexA.xdy
和indexB.xdy
)。这可以通过以下方式完成:
pdflatex test
texindy -M indexA.xdy indexA.idx
texindy -M indexB.xdy indexB.idx
pdflatex test
现在,假设我想通过以下方式自动化这个过程:
latexmk -norc -r latexmkrc2.tex test2
使用一些临时的latexmkrc2.tex
配置文件。问题是,虽然$makeindex
配置变量可以适应.idx
不同于源文件名:
$makeindex = 'texindy -M indexA.xdy %O -o indexA.ind indexA.idx'; #$
不能指定多次,一次为indexA
,一次为indexB
。
最小示例:
\documentclass{article}
\usepackage[xindy,nonewpage]{imakeidx}
\usepackage{filecontents}
\makeindex[name=indexA,title=Index A,options=-M indexA.xdy]
\makeindex[name=indexB,title=Index B,options=-M indexB.xdy]
\begin{filecontents*}{indexA.xdy}
(markup-index :open "~n
\begin{theindex}
\providecommand*\lettergroupDefault[1]{}
\providecommand*\lettergroup[1]{%
\textsf{#1}
\nopagebreak
}
~n"
:close "~n~n\end{theindex}~n"
:tree)
\end{filecontents*}
\begin{filecontents*}{indexB.xdy}
(markup-index :open "~n
\begin{theindex}
\providecommand*\lettergroupDefault[1]{}
\providecommand*\lettergroup[1]{%
\textit{#1}
\nopagebreak
}
~n"
:close "~n~n\end{theindex}~n"
:tree)
\end{filecontents*}
\begin{filecontents*}{latexmkrc2}
$makeindex = 'texindy -M indexA.xdy %O -o indexA.ind indexA.idx'; #$
$pdf_mode = 1; #$
\end{filecontents*}
\begin{document}
Term A\index[indexA]{Term from index A}
\par
Term B\index[indexB]{Term from index B}
\printindex[indexA]
\printindex[indexB]
\end{document}
编辑我的问题是:如何latexmk
按顺序配置,每次texindy
运行都要运行两次:
- 首先
texindy -M indexA.xdy indexA.idx
, - 其次是
texindy -M indexB.xdy indexB.idx
?
答案1
规则
$makeindex = 'texindy -M %B.xdy %O -o %D %S'; #$
就是你要找的(由latexmk
作者 John Collins 改进了我的原始版本)。 latexmk
小心地检测idx
写入了哪些文件,并且%B
规则中的 指的是.idx
文件的基础部分,而不是人们可能怀疑的 latex 文件的基础部分。 %S
和%D
是源文件和目标文件
跑步
pdflatex test1
提取额外的文件然后
latexmk -norc -r latexmkrc2.tex test1
test1.tex
在下面保存为产生的文件中
我相信这是您想要的输出。
\documentclass{article}
\usepackage[xindy,nonewpage]{imakeidx}
\usepackage{filecontents}
\makeindex[name=indexA,title=Index A,options=-M indexA.xdy]
\makeindex[name=indexB,title=Index B,options=-M indexB.xdy]
\begin{filecontents*}{indexA.xdy}
(markup-index :open "~n
\begin{theindex}
\providecommand*\lettergroupDefault[1]{}
\providecommand*\lettergroup[1]{%
\textsf{#1}
\nopagebreak
}
~n"
:close "~n~n\end{theindex}~n"
:tree)
\end{filecontents*}
\begin{filecontents*}{indexB.xdy}
(markup-index :open "~n
\begin{theindex}
\providecommand*\lettergroupDefault[1]{}
\providecommand*\lettergroup[1]{%
\textit{#1}
\nopagebreak
}
~n"
:close "~n~n\end{theindex}~n"
:tree)
\end{filecontents*}
\begin{filecontents*}{latexmkrc2}
$makeindex = 'texindy -M %B.xdy %O -o %D %S'; #$
$pdf_mode = 1; #$
\end{filecontents*}
\begin{document}
Term A\index[indexA]{Term from index A}
\par
Term B\index[indexB]{Term from index B}
\printindex[indexA]
\printindex[indexB]
\end{document}
答案2
HARDCODE,不太好……
mv indexA.xdy indexA.idx.xdy
mv indexB.xdy indexB.idx.xdy
在 latexmkrc 中
$makeindex = 'texindy -M %S.xdy %O -o %D %S';
# Warning:Hardcode,every [name].idx file corresponding to a [name].idx.ist