ハイパー日記システムやtDiaryではわりとメジャーな footnote *1 機能.しかし,Movable Type 周りでは,この機能を持つプラグインは見つかりませんでした *2.そこで,自分で作ってみることにしました.
初めは,add_text_filter なる API で作ってみたのですが,仕様上の制約によりあまり良い感じにはなりませんでした.しかし,これ以外の(プラグイン用の) API を用いたプラグインでは,テンプレートでしか使うことはできません.
で,解決策を探していたのですが,...ありました. Macros というプラグインを使えば良いようです.このプラグインは,テンプレート中でマクロを定義しておくと,任意の場所(エントリの中までも)で展開できるというものです.で,これを用いて footnote plugin を作ってみました.
1. はじめに
このプラグインは,Movable Type において,footnote *3を自動的に生成するためのものです.ただし,通常のプラグインはテンプレート中でしか作用しないため,別途,Macros の導入が必要です.
1.1. 入手先
本プラグインについて,私は一応著作権を主張しますが,改変,再利用等自由にやっていただいて構いません.また,使用上何か問題があっても,一切の責任は負いません.
- footnote.pl (2004/03/04)
2. 導入
2.1. Macros プラグインの導入
本プラグインは,Macros プラグインの下で動作するように作られています.まずこれを導入してください.なお,既に導入している場合は,この節を読み飛ばしてもらっても構いません.
まず,Macros をダウンロードし,展開します.次に展開されたファイルを所定の位置にコピーします.基本的には,「macros.pl」「macros.pm」「postproc.pm」の3つのファイルを
- (mt.cgi があるディレクトリ)/plugins/macros.pl
- (mt.cgi があるディレクトリ)/extlib/bradchoate/macros.pm
- (mt.cgi があるディレクトリ)/extlib/bradchoate/postproc.pm
としてコピーすれば良いでしょう *4.詳細については,Macros のマニュアルを読んでください.
2.2. footnote プラグインの導入
前述の footnote.pl をダウンロードし,以下にコピーしてください.
- (mt.cgi があるディレクトリ)/plugins/footnote.pl
3. 設定の例
本プラグインを利用するための設定は,各テンプレートの中に記述します.これらの定義は,大きく以下の3つに分けられます.
- 定義部
- 適用部
- 表示部
以下,それぞれについて設定例 *5を挙げます.
3.1. 定義部
ここでは,脚注を使うためのタグや 脚注 へのリンクの表示形式を定義します.これは,後述の適用部より前に記述してください.
<MTMacroDefine ctag="fn">
<MTFootnote value="[MTMacroContent]" reset="[MTMacroAttr name='reset']">
<MTFootnoteSet>
<sup>
<a href="#fn-<$MTEntryID$>-<$MTFootnoteTotalCount$>"
id="efn-<$MTEntryID$>-<$MTFootnoteTotalCount$>"
title="<$MTFootnoteString remove_html='1'$>">
*<$MTFootnoteCount$></a>
</sup>
</MTFootnoteSet>
<MTFootnoteGet>
<MTIfFootnoteExist>
<hr/>
<div>
<MTFootnotes>
<MTFootnoteNumbers glue=" ">
<a href="#efn-<$MTEntryID$>-<$MTFootnoteTotalNumber$>"
id="fn-<$MTEntryID$>-<$MTFootnoteTotalNumber$>">
*<$MTFootnoteNumber$></a>
</MTFootnoteNumbers>
: <MTFootnoteString><br />
</MTFootnotes>
</div>
</MTIfFootnoteExist>
</MTFootnoteGet>
</MTFootnote>
</MTMacroDefine>
3.2. 適用部
ここでは,footnote プラグインを適用する部分を指定します.通常は,「<$MTEntryBody$>」「<$MTEntryMore$>」に適用することになりますから,これらを「<MTMacroApply><$MTEntryBody$></MTMacroApply>」「<MTMacroApply><$MTEntryMore$></MTMacroApply>」と書き換えてください.
3.3. 表示部
適用部以外で脚注を表示させたい場合,任意の位置に記述します.通常は,上記適用部の直後に書いておきます.
<MTIfFootnoteExist>
<hr/>
<div>
<MTFootnotes>
<MTFootnoteNumbers glue=" ">
<a href="#efn-<$MTEntryID$>-<$MTFootnoteTotalNumber$>"
id="fn-<$MTEntryID$>-<$MTFootnoteTotalNumber$>">
*<$MTFootnoteNumber$></a>
</MTFootnoteNumbers>
: <MTFootnoteString><br />
</MTFootnotes>
</div>
</MTIfFootnoteExist>
3.4. 使用例
上記のように指定した場合は,エントリ内に「ほげ<fn>ふが</fn>」という記述があれば,「ほげ
*6」と変換され,指定された場所には脚注番号とともに「ふが」と表示されます.
文章量の多いエントリ等で,途中で脚注を表示させたい場合は,「<fn></fn>」と記述すると,それまでに指定された脚注をその位置に表示します.また,「<fn reset="1"></fn>」とした場合は,それまでの脚注を表示し,さらに移行の脚注番号が 1 から始るようになります
*7.
余談
余談となりますが,定義部や表示部を全てのテンプレートに書き込むのは面倒くさいことです.また,後に変更したい場合にも大変面倒くさい作業を行わなくてはなりません.そこで,テンプレートモジュール機能 *8を使うと便利です.
例えば,定義部を「fndefine」,表示部を「fnprint」という名前でテンプレートモジュールとして登録しておきます.そして,各テンプレートには,
<MTInclude module="fndefine">
や,
<MTInclude module="fnprint">
と記述することにより,各テンプレートに直接記述した場合と同じ効果が得られます.
4. 各タグの説明
この章では,Footnote プラグインで用いられるタグについて説明します.前述の設定例をカスタマイズしたい場合は参考にしてください.なお,Macros プラグインのタグについては,Macros のマニュアルを参照してください.
- MTFootnote
- footnote の定義を行うコンテナタグです.この中で,MTFootnoteSet と MTFootnoteGet を用います.ただし,そのうち一つだけしか用いない場合は省略可能です.
- value 属性
- footnote の内容を指定します.
- reset 属性
- 脚注の表示を行う場合,この属性値が真であれば,移行の脚注番号が 1 から始ります.
- MTFootnoteSet
- コンテナタグであり,この中で footnote の内容を設定するときの定義を行います.親要素の MTFootnote で value 属性に空文字列が与えられた場合,この要素は無視されます.MTFootnote を省略した場合は,この要素内の先頭で FootnoteString 要素により footnote の内容を指定する必要があります.
- MTFootnoteGet
- コンテナタグであり,この中で footnote の内容を取り出すときの定義を行います.親要素の MTFootnote で value 属性に空文字列以外の文字列が与えられた場合,この要素は無視されます.MTFootnote 要素を省略した場合は,この要素も省略できます.
- MTFootnoteString
- footnote の内容を指定したり取り出したりします.属性値の与え方により挙動が変化します.
- value 属性を指定
- 属性値を footnote の内容として記憶します.このタグの位置には,内容は表示されません.
- value 属性を指定しない
- 該当する footnote の内容を表示します.
- MTFootnotes
- コンテナタグであり,この中で脚注の表示の仕方を定義します.
- MTFootnoteCount
- footnote の通し番号を表示します.これは,エントリ内での通し番号です.前述の設定例では,これと MTEntryID を組み合わせてエントリ内のリンクを実現しています.
- MTFootnoteNumbers
- コンテナタグであり,getFootnote コンテナタグの中で使います.
Footnote プラグインでは,内容が全く同じ footnote はまとめて表示されます.この場合に,MTFootnoteNumbers コンテナタグの内容が必要なだけ繰り返し表示されます.- glue属性
- 表示する footnote の通し番号が複数ある場合,それぞれの間にこれで指定された文字列が挿入されます.
- MTIfFootnoteExist
- 条件タグです.表示すべき footnote が存在する場合に真となります.
5. 注意事項
脚注文字列の先頭に「(」,末尾に「)」がある場合,これらの各個記号は無視されます.これは,本プラグインが解釈されない場合
*9,例えば上記の例では,「ほげふが」と表示されるのを回避するためです.
常に,「ほげ<fn>(ふが)</fn>」と書くようにすれば,本プラグインが解釈されない場合でも表示は「ほげ(ふが)」となり,おかしな文章になることはありません.また,脚注として表示された場合は,前後の各個は自動的に取り除かれます.
6. 仕様上の制限
- 複数のエントリをまたいだ脚注は設定出来ません.
- 脚注の中で脚注を使うことは出来ません.
7. 最近の更新履歴
- (2008-08-24) 定期部のサンプルが間違っていたため、修正しました。ご指摘くださった方、ありがとうございました。
- (2004-03-04) Ver.0.6 エントリの途中で脚注番号をリセットできるように変更.これに伴いタグを変更したので,旧バージョンからアップデートする場合は,各設定についても修正してください.
- (2004-01-28) Ver.0.5 脚注を任意の位置で表示できるように変更.これに伴いタグを変更したので,旧バージョンからアップデートする場合は,各設定についても修正してください.
- (2004-01-26) ちょっとしたバグ修正....といっても一文字足しただけ.
- (2004-01-23) Perl5.005 対応....といっても「use warnings」を外しただけ.
- (2003-12-21) こうめい@なるぱら氏のご指摘により,上記設定例からクラス指定を削除.(プラグイン本体の修正はありません.)
- (2003-12-08) タグと各個の間にホワイトスペースが含まれる場合でも正しく除去できるように修正.
- (2003-12-04) setFootnote 内で FootnoteString を使ったとき,戻り値が正しくない問題を修正.
- (2003-11-29) 重複する脚注に対応.

すばらしいプラグインの公開をありがとうございます。
当サイトでも搭載させていただきました。
そこで少し気になった点を。。。
表示部分に区切り線を入れているのですが、ここにスタイシートを適用するタグとなっていますが、これをそのまま利用した際に、当サイトではページを表示した際に文章が無色となってしまいます(全選択で表示できるようになります)。
この部分のみスタイルシートの適用をなくしたところ正常に表示されるようになりました。
とりあえず報告まで。
私が使っている設定をそのまま載せてしまったのですが,実際に使っているスタイルやブラウザによっては正しく表示されないかもしれませんね.ややこしいので,設定例からクラス指定部分を削除しておきました.
ご指摘有難うございました.