(如果我的術語不正確,請道歉。)
我想為 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: }
沒有參數值,因此提取器將會失敗。