当主要内容位于另一个目录中时,如何从某一章节编译主要内容(使用 arara)?

当主要内容位于另一个目录中时,如何从某一章节编译主要内容(使用 arara)?

此解决方案如果主文件与章节文件位于同一目录中,则可以完美运行。

但假设我有:

maindirectory
  main.tex
  chapterdirectory
    chapter.tex

我如何进行编译main.texchapter.tex(我使用的是 Windows 10)。

我尝试过:

% arara: pdflatex: { files: [ "C:\maindirectory\main.tex" ] }

和其他各种组合但似乎arara只接受文件名。

这正是迪亚·阿比杜 (Diaa Abidou) 在他的评论中提出的幼稚问题,不幸的是,这个问题仍然没有得到答复。

答案1

版本地位记录

自古以来,我们就一直在讨论是否应该只使用文件名或整个引用。因此,版本 4.0 对此有两个变量:

  • file指的是文件名main.tex(没有目录引用),并且
  • reference指的是完整(规范化的、规范的)路径。

笔记:您可以查看日志文件中提取的指令列表(即,arara.log使用命令行选项启用),并查看和的--log实际值。还要注意,对于的每个元素,该工具都会添加自己的指令。filereferencefiles

有时我们会受到 TeX 工具覆盖范围的限制,因此我们选择了最简单的解决方案。但是,我必须指出,版本 4.0 允许基于项目的规则,因此,对于您来说,最干净的解决方案是:

  • 配置arara文件,以及
  • 自定义pdflatex规则,reference而不是file

然后

% arara: pdflatex: { files: [ 'chapters/main.tex' ] }

将按预期工作。另一种可能性(更高级)是file在命令创建期间保留但更改工作目录。我将在下面介绍这两种解决方案。

关于安全问题,我们在规则范围内拥有图灵完备的环境,因此在这种情况下几乎无能为力。深感抱歉。:)

因此,让我们介绍一下各种可能性。下面是一个使用基于项目的配置文件和修改后的引擎规则的可能解决方案(在此示例中,我将使用pdflatex)。首先,我创建以下配置文件(版本 4.0 允许配置文件有 4 个名称:araraconfig.yaml.araraconfig.yaml和。我将使用第一个选项。请注意,有一个查找顺序,因此请查看用户手册以了解更多详细信息)arararc.yaml.arararc.yaml

araraconfig.yaml(放置在项目的根级别)

!config
paths:
- '.'

现在让我们复制原文pdflatex.yaml规则到项目的根级别。现在,pdflatex指令将引用此规则而不是默认规则(因为paths配置文件中的键将当前目录设置为首先可搜索)。

第一种方法:替换filereference

这是最简单的解决方案。只需将第 16 行和第 17 行替换为pdflatex.yaml

    return getCommand('pdflatex', interaction, draft, shell,
           synctex, options, file);

这两个:

    return getCommand('pdflatex', interaction, draft, shell,
           synctex, options, reference);

请注意,我们只是用 替换filereference。这就足够了。指令用法如下:

% arara: pdflatex: { files: [ 'chapters/main.tex' ] }

第二种方法:添加工作目录选项

该解决方案涉及在我们的规则中添加一个额外的参数(我们可以将这些行附加到pdflatex.yaml):

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

现在我们应该替换第 16 行和第 17 行pdflatex.yaml

    return getCommand('pdflatex', interaction, draft, shell,
           synctex, options, file);

通过这些:

    if (isEmpty(directory)) {
        return getCommand('pdflatex', interaction, draft, shell,
               synctex, options, file);
    }
    else {
        return getCommandWithWorkingDirectory(directory, 'pdflatex',
               interaction, draft, shell, synctex, options, file);
    }

然后指令的使用应该遵循以下步骤:

% arara: pdflatex: { files: [ 'main.tex' ], directory: chapters }

希望有帮助!:)

相关内容