如何為 arara 識別碼指定兩個預設選項?

如何為 arara 識別碼指定兩個預設選項?

(如果我的術語不正確,請道歉。)

我想為 arara 寫一個可以接受參數的指令。該指令應根據以下規則設定輸出檔案的名稱:

  1. 如果未給予參數,則使用預設值。
  2. 如果給出了參數但沒有值,則使用該file變數。
  3. 如果給了參數,請使用該參數。

我認為正確的方法是:

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: }

沒有參數值,因此提取器將會失敗。

相關內容