(如果我的术语不正确,请原谅。)
我想为 arara 编写一个可以接受参数的指令。该指令应根据以下规则设置输出文件的名称:
- 如果没有给出参数,则使用默认值。
- 如果给出了参数但没有值,则使用
file
变量。 - 如果给出了参数,则使用该参数。
我认为正确的做法是:
command: 'echo @{ name == "" ? "default" : name }'
arguments:
- identifier: name
flag: '@{value == "" ? file : value }'
但我明白:ERROR: Parsing rule '<rulename>' failed. It might be a malformed directive or orb tag syntax.
如果我没有传递实际的参数。
以下是 MWE:
!config
# test rule for arara
# author: Andrew Stacey
identifier: echo
name: Echo the value of the argument
command: 'echo @{ name == "" ? "default" : name }'
arguments:
- identifier: name
flag: '@{value == "" ? file : value }'
然后在我的测试文档中我尝试以下之一:
% arara: echo
% arara: echo: {name: 'something'}
% arara: echo: {name: }
% arara: echo: {name: ''}
前两个有效,后两个无效。
这可能吗?
答案1
通过新3.x
系列,我们可以轻松地为参数扩展添加默认值。
新规则如下echo
:
!config
# test rule for arara
# author: Andrew Stacey
# requires arara 3.0+
identifier: echo
name: Echo the value of the argument
command: <arara> echo @{name}
arguments:
- identifier: name
flag: <arara> @{ isTrue( isEmpty( parameters.name ), file, parameters.name ) }
default: <arara> @{file}
新概念:
value
被名为 的映射所取代parameters
。如果我们想要访问one
指令参数,我们只需调用parameters.one
,而不是value
假设规则参数上下文中的值。<arara>
用在值的开头只是为了省去几个引号。扩展机制可以检测到这个关键字并安全地将其删除。您仍然可以使用引号,没有问题。- 现在规则参数可以有一个
default
值,该值是处理参数时首先要评估的值。如果没有default
提供,机制会将该值设置为''
(空字符串)。 - 我们现在在规则上下文中有几个内置函数可以帮助我们编写更简洁的代码:
string isTrue(boolean b, string s1, string s2)
:s1
若是b
则返回true
,否则返回s2
。boolean isEmpty(string s)
:检查是否s
为空并返回一个boolean
值:true
如果s
为空,false
否则。
值得注意的是,@{file}
现在扩展为文件名而不是基本名称。如果我们仍然想获取基本名称,还有一个内置函数:string getBasename(string s)
,@{ getBasename( file ) }
可以做到这一点。
现在,让我们看看执行情况:
第一条规则:如果没有给出参数,则使用默认值。
% arara: echo
\documentclass{article}
...
__ _ _ __ __ _ _ __ __ _
/ _` | '__/ _` | '__/ _` |
| (_| | | | (_| | | | (_| |
\__,_|_| \__,_|_| \__,_|
Running Echo the value of the argument...
teste.tex
Status: SUCCESS
第二条规则:如果给出了参数但没有值,则使用变量file
。
% arara: echo: { name: '' }
\documentclass{article}
...
__ _ _ __ __ _ _ __ __ _
/ _` | '__/ _` | '__/ _` |
| (_| | | | (_| | | | (_| |
\__,_|_| \__,_|_| \__,_|
Running Echo the value of the argument...
teste.tex
Status: SUCCESS
第三条规则:如果给出了参数,就使用它。
% arara: echo: { name: duck }
\documentclass{article}
...
__ _ _ __ __ _ _ __ __ _
/ _` | '__/ _` | '__/ _` |
| (_| | | | (_| | | | (_| |
\__,_|_| \__,_|_| \__,_|
Running Echo the value of the argument...
duck
Status: SUCCESS
原始答案中的评论% arara: echo: { name: }
仍然有效。由于name
没有参数值,提取器将失败。
原始答案仅供历史参考。它适用于arara 2.x
我怎么会错过阿拉拉标签?:)
遗憾的是,您遇到了一个在我发布该系列的测试套件中没有注意到的烦恼2.x
:上下文中唯一可用于扩展的变量arguments
是它value
本身。因此不幸的是file
- 以及任何其他变量 - 都不起作用并arara
会引发错误。希望即将推出的版本能够解决这个问题。
此外,在下一个版本中,我计划为参数设置默认回退,这样我们就不需要编写条件来检查值是否已设置。但那是另一个故事,希望是新3.x
系列。:)
目前,使echo
规则发挥作用的唯一方法是检查command
上下文中的变量:
command: 'echo @{ name == "" ? file : name }'
arguments:
- identifier: name
flag: '@{value}'
在新版本中,我们将能够写入以下内容:
command: 'echo @{name}'
arguments:
- identifier: name
flag: '@{value}'
default: '@{file}'
指令
% arara: echo
% arara: echo: {name: 'something'}
% arara: echo: {name: something}
% arara: echo: {name: ''}
应该工作(最后一个有工作,除非你发现另一个烦恼)。:)
现在,
% arara: echo: {name: }
没有参数值,因此提取器将失败。