arara 識別子に 2 つのデフォルト オプションを指定するにはどうすればよいですか?

arara 識別子に 2 つのデフォルト オプションを指定するにはどうすればよいですか?

(用語が間違っていたらごめんなさい。)

引数を取ることができる 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: ''}

最初の 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.onevalue
  • <arara>値の先頭に使用されているのは、引用符をいくつか節約するためだけです。展開メカニズムはこのキーワードを検出し、安全に削除できます。引用符は引き続き使用でき、問題はありません。
  • ルール引数にはdefault値を指定できるようになりました。この値は、引数が処理されるときに最初に評価されます。値が指定されていない場合default、メカニズムは値を''(空の文字列) に設定します。
  • ルール コンテキストには、より簡潔なコードを書くのに役立ついくつかの組み込み関数があります。
    • string isTrue(boolean b, string s1, string s2):のs1場合はを返し、そうでない場合は を返します。btrues2
    • boolean isEmpty(string s):sが空かどうかをチェックし、空の場合はboolean値を返します。それ以外のtrue場合は値を返します。sfalse

がベース名ではなくファイル名に展開されるようになったことに注意することが重要です@{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: }

引数値がないため、抽出は失敗します。

関連情報