如何使用 arara 获取多个索引?

如何使用 arara 获取多个索引?

我必须如何更改arara下面的命令才能打印姓名索引?目前,我只得到了主索引。

% arara: pdflatex
% arara: bibtex
% arara: pdflatex
% arara: pdflatex
% arara: nomencl
% arara: makeindex
% arara: pdflatex
% arara: pdflatex
% !arara: indent: { overwrite: false, output: outputfile.tex, trace: true }

\documentclass{memoir}
\usepackage[backend=bibtex,style=numeric]{biblatex}
\addbibresource{mybib.bib}
\usepackage{nomencl}
\makenomenclature
\makeindex
\makeindex[names]

\begin{document}

\chapter{Area} \label{chap:area}
\section{Area of a circle} \label{sec:circle-area}

Consult \textcite{Archimedes200} and \textcite{EulerE1776}.
\index[names]{Archimedes}
\index[names]{Euler, Leonhard}

The area $A$ 
\nomenclature{$A$}{area}%
of a circle with radius $r$
\nomenclature{$r$}{radius of circle}%
is defined as
\begin{equation}
    A = \pi r^{2}.
\end{equation}
\index{area!of circle}
\index{area}
\index{circle!area of}

\printbibliography

\printnomenclature

\renewcommand{\indexname}{Index of Names}
\printindex[names]

\renewcommand{\indexname}{Index}
\printindex

\end{document}

文件如下mybib.bib

@article{Archimedes200,
  author = {Archimedes},
  title = {Pi's the limit},
  journal = {Syracuse J. Gastronom.\ Math.}, 
  year = {200BCE},
  volume = {10},
  pages={\textsc{CCCXV}--\textsc{CCCXIV}}
}
@article{EulerE1776,
  author = {Euler, Leonhard},
  title = {All about E},
  journal = {Math.\ Psychol.},
  year = {1776},
  volume = {4},
  pages={1--2718}
}

答案1

感谢 Paulo 向我展示了这一点:所有arara规则都有一个名为的隐式参数files,它采用(以逗号分隔的)文件名列表。arara然后将在此列表中进行迭代并将该指令应用于列表中的每个项目。

另一点是,您不需要在 BibTeX 和 MakeIndex 之间运行两次 pdfLaTeX:第一次运行 pdfLaTeX 足以生成外部工具的辅助文件。最后两次运行 pdfLaTeX 是必要的,以包含生成的参考书目/索引并整理交叉引用。

您的指令列表可以更改为:

% arara: pdflatex
% arara: bibtex
% arara: makeindex
% arara: makeindex: { files: [ names ] }
% arara: pdflatex
% arara: pdflatex

makeindex并且可能只用一行替换两行(假设您的主.tex文件是main.tex% arara: makeindex: { files: [ main, names ] }:。

或者,如果你想要arara聪明一点,跳过不必要的步骤(解释这里):

% arara: pdflatex: { draft: yes }
% arara: bibtex if changed (toFile('mybib.bib'))
% arara: --> || found ('log', 'Warning: Citation')
% arara: makeindex: { files: [ main, names ] } if changed ('idx')
% arara: pdflatex until !found('log', '\\(?(R|r)e\\)?run (to get|LaTeX)')

另一个选项,正如 barbarabeeton 在评论中提到的,是从 pdfLaTeX 内部imakeidx运行的包。由于是一个受信任的程序,因此允许它在通常启用的受限 shell-escape 中运行。该包已经处理了多个索引和所有内容。makeindexmakeindeximakeidx

要使用它,您只需用 加载它\usepackage{makeindex},然后用\makeindex[names]替换\makeindex[name=names]

但是repeatindex您使用的包似乎与imakeidx...不兼容,我会尝试找出原因。


或者,如果您喜欢看起来像个酷小孩(就像我一样,在被告知参数之前就做了所有这些事情files:-)并且以困难的方式完成它,您可以对文件进行小的修改makeindex.yaml并添加一个basename选项,该选项采用索引文件的基本名称(names在您的情况下)并对其进行处理,而不是当前文件名。

首先,在该arguments:行下面makeindex.yaml添加选项本身:

- identifier: basename
  flag: >
    @{
      parameters.basename
    }

(显然,由于某种原因,Java 不喜欢您仅使用base,因此我使用了更详细的basename。)我们将此选项设置为没有默认值,以便当它为空时我们使用getBasename(file)

现在我们修改该command:部分以使用该选项:

  command: >
    @{
        if (isEmpty(basename))
          { basename = getBasename(file); }
        infile = basename.concat('.').concat(input);
        outfile = [ '-o', basename.concat('.').concat(output) ];
        logfile = [ '-t', basename.concat('.').concat(log) ];
        return getCommand('makeindex', german, style, order, options,
                          logfile, infile, outfile);
    }

首先我们检查是否basename为空;如果为空,则使用来自的当前文件名getBasename(file)。然后正常进行添加输入、输出和日志文件的扩展名,然后调用makeindex可执行文件。

(为方便起见,完整修改后的版本makeindex.yaml位于本答案的底部)

此后,您可以将指令更改为:

% arara: pdflatex
% arara: bibtex
% arara: makeindex
% arara: makeindex: { basename: names }
% arara: pdflatex
% arara: pdflatex

pdflatex(请注意,我删除了之前的两条规则makeindex:您不需要它们。)

现在您应该已经正确编译了索引。


如果你没有在原始副本中进行更改makeindex.yaml(你真的应该不是),那么你需要将新makeindex.yaml文件保存在某个文件夹中,然后创建一个.araraconfig.yaml包含以下内容的文件:

paths:
- '/path/to/the/folder/'

并将其放在.araraconfig.yaml当前工作目录或文件夹中USER_HOME(有关详细信息,请参阅 arara 手册第 4 章)。如果文件makeindex.yaml也在当前工作目录中,您可以- './'在配置文件的第二行中使用它。


完整makeindex.yaml文件:

!config
# Arara, the cool TeX automation tool
# Copyright (c) 2018, Paulo Roberto Massa Cereda 
# All rights reserved.
#
# This rule is part of arara.
identifier: nmakeindex
name: MakeIndex
authors:
- Marco Daniel
- Paulo Cereda
commands:
- name: The MakeIndex software
  command: >
    @{
        if (isEmpty(basename))
          { basename = getBasename(file); }
        infile = basename.concat('.').concat(input);
        outfile = [ '-o', basename.concat('.').concat(output) ];
        logfile = [ '-t', basename.concat('.').concat(log) ];
        return getCommand('makeindex', german, style, order, options,
                          logfile, infile, outfile);
    }
arguments:
- identifier: basename
  flag: >
    @{
      parameters.basename
    }
- identifier: input
  flag: >
    @{
      parameters.input
    }
  default: idx
- identifier: output
  flag: >
    @{
      parameters.output
    }
  default: ind
- identifier: log
  flag: >
    @{
      parameters.log
    }
  default: ilg
- identifier: german
  flag: >
    @{
        isTrue(parameters.german, '-g')
    }
- identifier: order
  flag: >
    @{
        if ([ 'letter', 'word' ].contains(parameters.order)) {
            return isTrue(parameters.order == 'letter', '-l', '');
        }
        else {
            throwError('The provided order is invalid.');
        }
    }
- identifier: style
  flag: "@{ [ '-s', parameters.style ] }"
- identifier: options
  flag: >
    @{
        if (isList(parameters.options)) {
            return parameters.options;
        }
        else {
            throwError('I was expecting a list of options.');
        }
    }

相关内容