みなさん、こんにちは。
しばらく fl
マクロから離れていましたが、やっとマクロの機能拡張の話に戻ることができます。
課題をもう一度整理してみましょう。
#argument
の戻り値でどの alternative
が入力されたかが分かるという話をしました。そうすると次は alternative
ごとに処理を分けたくなりますね。つまり条件分岐が必要になります。そこで #if
の登場です。
B については
を
に読み替えてやればいいので A を実現できれば B はすぐに実現できそうです。
さあここでもう一度 fl
マクロのソースを眺めてみましょう。
まずは「A ワイルドカードに対応」です。ワイルドカードをパラメータとして取り込むには、#argument
に TEMPLATE alternative
を指定すればできましたね。今の fl
マクロは、fn1 variable
にファイル名を格納するように作っていますのでワイルドカードに相当する個別ファイル名を fn1 variable
に格納してやれば動作します。ワイルドカードに相当する個別ファイルは複数あることを考慮すると
variable
に代入fn1 variable
に代入するfl
マクロロジックを使って表示するfn1 variable
に代入するというフローで実現できそうです。「1 ワイルドカードを variable
に代入」は次のようにしましょう。
#argument/value tmp/TEMPLATE END
「B パラメータなしでも動作」の場合は END
がヒットすることになります。
この場合には tmp variable
が空白になるので *
を代入しておきます。これで B は実装完了です。お手軽ですね。
「2 ワイルドカードからファイル名を取りだす」は、#filenames
という built-in function
を使って次のようにします。
#set fn1 [#filenames/maximum 1/ [tmp]]
「4 次のファイル名を取りだす」もやはり #filenames built-in function
を使いますが、オプションが少し変わります。
#set fn1 [#filenames/maximum 1, previous [fn1]/ [tmp]]
「5 3 に戻る」は #loop
で実現できそうです。
まとめると、A / B を実装した段階でマクロは次のようになります。
実行してみましょう。複数のファイルがある subvol
を指定してみます。
結果が出るには出たけれど……美しくありません。その理由は VOL 名などのタイトル行がファイル毎に印字された点です。原因は明らかでブレイク処理が入っていないせいですね。ブレイク条件は「sb2 variable
の内容が変更されたとき」で、そのときだけタイトル行を印字すればいいわけです。
breakvol variable
を使ってブレイク条件をコントロールしています。
これでずいぶんと見やすくなりました。
次回は「C ファイル名複数指定」です。Au revoir!