使用 arara 从同一个 tex 文件生成两个 pdf 版本(基于条件语句)

使用 arara 从同一个 tex 文件生成两个 pdf 版本(基于条件语句)

我教授大学课程,我的目标是能够pdf从同一个tex文件中输出两个:

  1. 问题集
  2. 问题集及其解决方案

我已经手动执行了此操作,方法是\newif调用,然后根据是否要输出解决方案在标题中设置\soltrue或。然后我将解决方案括在和中,我们就可以开始比赛了。这很棒,因为对问题集的编辑只需要更改一个文档,而不是两个。唯一的烦恼是我必须编译一次,更改名称,然后将标题从更改为,然后再次重新编译以获取两个文档。我想使用来自动执行此操作。\solfalse\ifsol\fipdf\soltrue\solfalsearara

我一直在关注这个优秀的如何创建yaml规则来arara执行我想要的操作。在操作指南中,作者 (cmhughes) 创建了一条规则,将文档编译tex为两个pdf,一个有一列,另一个有两列。显然我的应用程序略有不同。

我制定了以下solutions.yaml规则:

!config
# Make two versions of document depending on if statement "sol"
# author: Shane Auerbach (based on work by Chris Hughes)
# requires arara 3.0+
#
# Sample usage
#
# % arara: solutions
# % arara: solutions: {solutions: true}
# % arara: solutions: {solutions: false}
#
identifier: solutions
name: Solutions
commands: 
- <arara> pdflatex "\newif\ifsol\sol@{trigger}\input{@{file}}" 
- <arara> @{ isWindows( "cmd /c move", "mv" ) } @{getBasename(file)}.pdf @{getBasename(file)}@{trigger.toUpperCase()}.pdf
arguments: 
- identifier: trigger
  flag: <arara> @{parameters.trigger}
  default: false

这是测试mytex.tex文件:

% arara: solutions:  {trigger: true}
% arara: solutions: {trigger: false}

\documentclass{article}
\begin{document}
Question: What is $2+2$?
\ifsol \begin{quote} \textbf{Solution:} $2+2=3$ \end{quote} \fi
\end{document}

效果很好。当我在文件arara上运行它时tex,它会输出两个pdf,一个带有解决方案,一个不带有解决方案,正如期望的那样。我想做两项改进,但不知道如何实现:

  1. 就目前而言,我目前只能用 编译文件,tex因为arara文件本身没有\soltrue\solfalse。我希望能够放入一些东西来设置它,当且仅当它尚未被设置时,arara这样我arara也可以在 之外编译它。但我不想让它覆盖arara的设置,因为这会违背目的。有什么想法吗?

  2. 目前pdf生成的文件称为mytexTRUE.pdf(带解决方案)和mytexFALSE.pdf(不带解决方案)。我更喜欢mytexS.pdf(带解决方案)和mytexQ.pdf(不带解决方案)这样的东西。我能想到的唯一实现方法是使用条件语句solutions.yaml,但从我读到的内容来看,yaml它并不是为条件语句设计的。在这方面有什么想法吗?

如果你读到了这里,你就是一个真正的英雄。谢谢!如果你跳过了中间部分,那么 tl;dr:帮助这个陌生人使他的工作流程稍微更有效率一些。

答案1

实现第一个改进的可能方法是利用\ifdefined而不是像原始代码那样依赖\newif。让我们看看新的 TeX 代码:

\documentclass{article}
\begin{document}
Question: What is $2+2$?
\ifdefined\solutionflag\begin{quote} \textbf{Solution:} $2+2=3$ \end{quote}\fi
\end{document}

这里的计划很简单:如果\solutionflag定义了,则将处理该特定代码摘录。这个想法与使用非常相似\if<flag>,但如果未设置此装置,它不会发出抱怨。:)

上面的代码可以用您喜欢的引擎正常编译,并且不需要arara。如果您想打印答案,只需\def\solutionflag{}在序言中的某个地方写下,我们就完成了。

更新:此答案已更新为版本 4.0+ 的规则。请查看旧版本的编辑历史。

我们来看看这个改进的规则:

!config
identifier: solutions
name: Solutions
authors:
- A duck
commands:
- name: The engine
  command: >
    @{
        prefix = isTrue(solutions, '\\def\\solutionflag{}', '');
        input = '\\input{' + reference.getName() + '}';
        return getCommand(engine, prefix + input, options);
    }
- name: The renaming procedure
  command: >
    @{
        separator = java.io.File.separator;
        prefix = [];
        if (isUnix()) {
            prefix = [ 'mv' ];
        }
        else {
            prefix = [ 'cmd', '/c', 'move' ];
        }
        parent = reference.getParent(); 
        input = parent + separator + getBasename(reference) + '.pdf';
        output = parent + separator + name + '.pdf';
        return getCommand(prefix, input, output);
    }
arguments:
- identifier: engine
  flag: >
    @{
        if ([ 'pdflatex', 'latex', 'xelatex',
              'lualatex' ].contains(parameters.engine)) {
            return parameters.engine;
        }
        else {
            throwError('The provided engine is not valid');
        }
    }
  default: pdflatex
- identifier: name
  flag: >
    @{
        return parameters.name;
    }
  required: true
- identifier: solutions
  flag: >
    @{
        return isTrue(parameters.solutions);
    }
  default: >
    @{
        return false
    }
- identifier: options
  flag: >
    @{
        if (isList(parameters.options)) {
            return parameters.options;
        }
        else {
            throwError('I was expecting a list of options.');
        }
    }

规则论点:

  • engine:字符串,可选,设置引擎。可能的选项有、 和pdflatexlatex默认值:。xelatexlualatexpdflatex

  • solutions:自然布尔值,可选,设置解决方案宏是否在文档范围内定义。默认值:false

  • name:字符串,必需,设置文档名称。文档将重命名为此值。无需指定.pdf扩展名。

  • options:列表,可选,设置要提供给引擎的附加命令行参数列表。

执行示例:

% arara: solutions: { solutions: true, name: 'answers' }
% arara: solutions: { solutions: false, name: 'questions' }

\documentclass{article}
\begin{document}
Question: What is $2+2$?
\ifdefined\solutionflag\begin{quote} \textbf{Solution:} $2+2=3$ \end{quote}\fi
\end{document}

使用以下命令运行arara

[paulo@cambridge ~] $ $ arara test.tex 
  __ _ _ __ __ _ _ __ __ _ 
 / _` | '__/ _` | '__/ _` |
| (_| | | | (_| | | | (_| |
 \__,_|_|  \__,_|_|  \__,_|

Processing 'test.tex' (size: 264 bytes, last modified: 03/22/2020
06:54:54), please wait.

(Solutions) The engine .................................. SUCCESS
(Solutions) The renaming procedure ...................... SUCCESS
(Solutions) The engine .................................. SUCCESS
(Solutions) The renaming procedure ...................... SUCCESS

Total: 1.25 seconds

我们得到以下输出:

[paulo@cambridge ~] $ ls *.pdf
answers.pdf  questions.pdf

另一个有趣的建议是通过创建一个有选择地显示解决方案的环境来改进文档语义。以下代码由 David Carlisle 友情建议(我欠他 5 美元):

\newenvironment{solution}{\ifdefined\solutionflag\else\setbox0\vbox\fi\bgroup}{‌​\par\egroup}

希望能帮助到你!:)

相关内容