$makeindex latexmk 的配置变量如何适应多个 .idx 文件(与源文件名不同)?

$makeindex latexmk 的配置变量如何适应多个 .idx 文件(与源文件名不同)?

考虑一个test1.tex包含(单个)索引的文件,该文件应具有特殊的布局,并且应使用特定的样式(例如 index.xdy)。这可以通过以下过程完成:

  1. pdflatex test1
  2. texindy -M index.xdy test1.idx
  3. 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.xdyindexB.xdy)。这可以通过以下方式完成:

  1. pdflatex test
  2. texindy -M indexA.xdy indexA.idx
  3. texindy -M indexB.xdy indexB.idx
  4. 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  

相关内容