マクロ

TWのメモ

マクロとは

ウィジェット等を組み合わせて作った機能を新しい機能として定義して(作って)簡単に呼び出す(使う)ための機能です
定義したマクロは編集のスタンプアイコン(snippet)に登録しておくといいかもしれません

マクロを定義したTiddlerに「$:/tags/Macro」タグをつけることでそのTiddler以外からも呼び出しができるようになります
その他TWに標準で定義されているCore Macrosも存在します

JavaScriptで定義することも出来ますが、ここでは扱いません

定義(Macro Definitions in WikiText)

マクロの作り方です
今は作らない場合は呼び出し(Macro Calls in WikiText)まで飛ばしてください
マクロの内容によって書き方に多少幅があります

複数行マクロ

\define マクロ名()
マクロの本体
\end

マクロ名と(は続けて書く必要があります(スペースも入れてはいけません)

1行マクロ

\define マクロ名() マクロの本体

複数行マクロと異なり\endはつけません

引数の書き方

\define マクロ名(引数1, 引数2)
マクロの本体
\end

引数の書式は入力がない場合のデフォルト値を指定するなら引数名:デフォルト値、無い場合は引数名です
1行マクロも引数の書き方は同様です

マクロの本体で引数や外部の変数を使う方法

マクロの本体では引数だけでなく呼び出し元で定義された変数(またはマクロ)を使うことができます。また、呼び出し方は2種類あります(後述)

書式対象挙動
$引数名$マクロで定義した引数に渡された値渡された文字列に置換します
$(変数名)$マクロの外で定義された変数やマクロ結果の文字列に置換します
<<_引数名_>>マクロで定義した引数に渡された値呼び出し
<<変数名>>マクロの外で定義された変数やマクロ呼び出し

置換は対象の値や結果に置換した後でマクロの本体が実行されます
つまり、その対象の値や結果が元々そこに書いてあったかのように振舞うということです
これは文字列の結合を簡単に表現できる方法です
例えば前後に文字列を追加した物をマクロやウィジェットに渡す時に便利です

呼び出しは普段の呼び出しと同様です
こちらは置換で問題になる値に含むことの出来ない文字列を回避することができます
例えばマクロやウィジェットに値として"$name$"のように渡した場合、nameの値に"が含まれていた場合に機能しません

置換の必要性がなければ呼び出しの方を使う方が文字の制限を受けずに済んでいいかもしれません

呼び出し(Macro Calls in WikiText)

呼び出し方は2種類あります

通常の呼び出し

<<マクロ名>>
<<マクロ名 引数名1:値1 引数名2:値2>>
<<マクロ名 引数1の値 引数2の値>>

マクロに定義された引数の順番通りに値を書くことで3行目のように引数名を省略できます
引数名を指定する方法には順番を無視できる他に1個ずれてたみたいなミスを防げるメリットがあります
マクロによってはこの些細なミスで長時間悩む場合もあるかも?

また、変数も1行目と同様の書き方で呼び出されます
<<currentTiddler>>とか、SetWidgetやVarsWidgetなどで設定した変数とか

MacroCallWidgetを使った呼び出し

<$macrocall $name="マクロ名" 引数名=値/>

通常の呼び出しで使う書式の上位版です
通常の呼び出しではうまくいかない時でもこちらで呼び出すとうまくいく場合があるかもしれません

引数について

引数には値を直接渡す以外にもTextReferenceやマクロやフィルターの結果等を渡すこともできます
マクロを渡したい場合はマクロコールウィジェットを使います

使える文字/使えない文字

気になったら読む程度で問題ないです。Core Macrosまで飛ばして構いません

マクロ名

マクロ名には使えない文字があります。
(は定義する際には使えません
>は通常の呼び出しを行う際には使えません
なので()<>の4文字は使わない方が良いです
実は日本語は使えますが、ずっと使えるかは分からないのでアルファベットを使う方が確実でしょうか

なお、>はマクロコールウィジェットを利用すれば今のところ使えます
使うべきではないでしょうが

引数名

引数名はアルファベットの大文字と小文字、数字、-_のみが使えます
日本語は使えません

マクロ定義における引数同士の区切り

引数同士の区切りとして,やスペースや改行等を使うことができます
また、デフォルト値を指定するときの:の前後にもスペース等の空白文字を入れることが出来るようです

値は以下のように書けます(デフォルト値も同様です)

値に含むことの出来ない文字列
"""値""""""
"値""
'値''
[[値]]]
"'とスペースや改行

Core Macros

TWに標準で用意されているマクロから一部を簡単に紹介
基本的に公式の各TiddlerのParametersがマクロの引数の順番になっている

おすすめ

tabs Macroフィルターで指定したTiddlerをタブで切り替え可能な形式で表示する(タブブラウザのように)
タブに縦と横のパターンがある
Table-of-Contents Macrosタグを利用してツリーっぽい表示を作って表示したりtabsマクロの用にできる
いわゆる目次でtocと略して表記されたりする
引数のsortを"all[tiddlers]任意のオペレーター"とすることでタグ抜きでの利用も可能
例えば"all[tiddlers]prefix[SystemTag]"
ただ、タグ抜きだと階層化はされない(多分)
toc-tabbed-internal-navマクロやtoc-tabbed-external-navマクロは個人的におすすめ
tree MacroTiddlerタイトルの/を区切り文字に見立てて階層化して表示します
百聞は一見にしかず

使うかも?

tag Macro指定したタグを表示できる
クリックすると指定のタグがついたTiddlerの一覧を表示
各Tiddlerの本文の上に表示されている物と同じ
now Macro指定した形式で日時を表示できる
ただし表示されるのはこのマクロが表示された瞬間の物で、時計の代わりにはならない
ウィジェット等に渡して使うことがある
timeline Macroサイドバーの最近の更新(Recent)に表示されている更新履歴と同じ物を表示できる
subfilterに"任意のオペレーター"とすることで対象のTiddlerを絞り込める
標準ではシステムTiddlerは対象外なので必要ならばsubfilterで含めるようにする

今のところToCマクロのsortとtimelineマクロのsubfilterはマクロ内では$引数名$でフィルター内部に埋め込まれて(置換で)利用されているので元のフィルターを無視した運用ができる

マクロ等何か作る時に使えるマクロ

qualify Macro(渡した文字列)-(currentTiddler依存(?)のユニークな数字)を返す
マクロを作る時にマクロの本体中にどこかのフィールドに入力を行う場合に便利
普通に作ると同じフィールドに書き込まれてしまうため、複数箇所で使うには同時に使わないようにするか呼び出しで毎度書き込み先を指定することになるが、qualifyマクロを使うとその手間が省ける
ただし、同じTiddlerで二度以上使う場合は指定も必要になる(同じ数字が付与されるので)