(用語が間違っていたらごめんなさい。)
引数を取ることができる 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: ''}
最初の 2 つは機能しますが、次の 2 つは機能しません。
これは可能ですか?
答え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
2 番目のルール: 引数が指定されているが値がない場合、file
変数を使用します。
% arara: echo: { name: '' }
\documentclass{article}
...
__ _ _ __ __ _ _ __ __ _
/ _` | '__/ _` | '__/ _` |
| (_| | | | (_| | | | (_| |
\__,_|_| \__,_|_| \__,_|
Running Echo the value of the argument...
teste.tex
Status: SUCCESS
3 番目のルール: 引数が指定されている場合は、それを使用します。
% 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: }
引数値がないため、抽出は失敗します。