[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

18. 新しいTexinfoコマンドの定義

Texinfoは,新しいコマンドを定義する様々なコマンドを提供します.

18.1 マクロの定義  Defining and undefining new commands.
18.2 マクロの呼び出し  Using a macro, once you've defined it.
18.3 マクロの詳細  Beyond basic macro usage.
18.4 `@alias new=existing'  Command aliases.
18.5 `definfoenclose': 強調のカスタマイズ  Customized highlighting.


18.1 マクロの定義

マクロを定義するため,以下のようにTexinfoの@macroコマンドを使用 します.

 
@macro macroname{param1, param2, ...}
text ... \param1\ ...
@end macro

パラメータ(parameters)param1param2...は,後 でマクロをドキュメントで使用するとき(次のセクションで記述します)に供給さ れる引数に対応します.

マクロがTeXで動作するため,macronameは完全に文字から成り立って いる必要があります.数字,ハイフン,アンダースコア,または他の特別な文字 を含めてはいけません.

マクロがパラメータを必要としない場合,空のリスト(`@macro foo {}'),またはカッコ無し(`@macro foo')で定義することが可能です.

定義やマクロの本体(body)は,前に定義されたマクロを含め,ほとんどの Texinfoコマンドを含めることが可能です.まだ定義されていないマクロの呼び 出しはできません.このため,相互に繰り返されるTexinfoマクロを持つことは 不可能です.また,他のマクロを定義するマクロ定義は,@macroの設計 の制限のため,TeXでは動作しません.

マクロの本体では,上記の例では`\param1\'のようにバックスラッ シュで囲まれているパラメータ名のインスタンスは,マクロ呼び出しでの対応す る引数で置換されます.パラメータ名は,ゼロ回を含め何度でも本体で使用可能 です.

マクロ式での単一の`\'を得るため,`\\'を使用してください.ほか のあらゆる本体での`\'の使用は警告されます.

@macro行の後と@end macro行の前の改行は無視されるので,マ クロ本体に含まれません.全ての他の空白は通常のTexinfoの規則に従って扱わ れます.

マクロを再帰的に使用可能にするため,すなわち,引数としてそれ自身を呼び出 すため,以下のように`@rmacro'で定義する必要があります.

 
@rmacro rmac {arg}
a\arg\b
@end rmacro
...
@rmac{1@rmac{text}2}

これは,出力`a1atextb2b'を生成します.`@rmacro'の代わりに `@macro'を用いた場合,エラーメッセージが表示されるでしょう.

@unmacro fooを用いて,マクロfooを未定義にすることが 可能です.既に未定義にされたマクロを未定義にすることはエラーではありませ ん.例えば以下のようにします.

 
@unmacro foo


18.2 マクロの呼び出し

マクロの定義後(前のセクションを参照してください),以下のようにドキュメン トで使用(呼び出し(invoke))可能です.

 
@macroname {arg1, arg2, ...}

そして,結果はその場所にmacroname本体を入力したかのようになります. 例えば以下のようにします.

 
@macro foo {p, q}
Together: \p\ & \q\.
@end macro
@foo{a, b}

以下を生成します.

 
Together: a & b.

このため,引数とパラメータはカンマで分けられ,カッコで範囲を制限します. カンマの後(前は違います)のあらゆる空白は無視されます.マクロが引数を取ら ない場合でもカッコは呼び出しで(定義では違います)要求され,他の全ての Texinfoコマンドとの一貫性を保ちます.

 
@macro argless {}
ここに引数はありません.
@end macro
@argless{}

以下を生成します.

 
ここに引数はありません.

カンマ,カッコ,またはバックスラッシュを引数に挿入するため,以下のように バックスラッシュを前置します.

 
@macname {\\\{\}\,}

それは,引数`\{},'をmacnameに渡します(ほとんど確実にエラー を生成します).しかし,カッコ内のカンマはバックスラッシュでエスケープさ れていても.TeXで問題になるでしょう.

マクロが単一の引数を取るように定義されていて,カッコ無しで呼び出された場 合,マクロ名の後の行の残り全体は引数として供給されます.例えば,以下のよ うになります.

 
@macro bar {p}
Twice: \p\ & \p\.
@end macro
@bar aah

以下を生成します.

 
Twice: aah & aah.

マクロが単一の引数を取るように定義されていて,カッコ付で呼び出された場合, カンマにかかわらずカッコ付のテキストは引数として渡されます.例えば以下の ようになります.

 
@macro bar {p}
Twice: \p\ & \p\.
@end macro
@bar{a,b}

以下を生成します.

 
Twice: a,b & a,b.


18.3 マクロの詳細

TeXとmakeinfoの実装には避けることのできない相違があるので, Texinfoマクロは以下の制限があります.

マニュアルの印刷バージョンを生成しているとき,マクロ機能でエラーが生じる 場合,texi2dviを`-E'オプションを用いて呼び出し, makeinfoでマクロの展開を試みてください.19.3 texi2dviでの書式化を参照してください.


18.4 `@alias new=existing'

`@alias'コマンドは,新しいコマンドを既存のものと同じように定義しま す.これは追加のマークアップ名の定義に便利で,このため出力結果が同じであっ ても,入力の意味論的な情報を維持します.

`@alias'コマンドを単独行に書き,新しいコマンド名,等号,そして既存 のコマンド名を続けてください.等号の周りの空白は無視されます.このため以 下のようにします.

 
@alias new = existing

例えば,ドキュメントが本と他のメディア(例えば動画)の両方への引用を含んで いる場合,通常の@cite{}と同じことを行いますが,同じような余分 な意味論的情報をもたらすマクロ@moviecite{}を定義したい可能性が あります.このため以下のようにします.

 
@alias moviecite = cite

気まぐれな引数の解析のため,マクロは常に同じ結果となるわけではありません. また,別名はマクロより定義が簡単です.そのため,コマンドは重複しません. (また,専門語ファイルで大量に使用されました!)

別名は,直接的や間接的に,再帰的してはいけません.


18.5 `definfoenclose': 強調のカスタマイズ

@definfoencloseコマンドは,Infoに対しては使用しTeXに対しては 使用しない強調コマンドの定義として使用してもかまいません. @definfoencloseで定義されたコマンドは,前後のテキストの文字列内 の,そのコマンドで囲んだテキストに印を付けます.Info出力に似た制御を行な うためこれを使用することも可能です.

おそらく,Infoに対し@definfoencloseでコマンドを定義する場合, `texinfo.tex',`texinfo.cnf',またはドキュメントの `@iftex'の中でTeXに対し対応するコマンドを作成することになるでしょ う.

@definfoencloseコマンドを一行で書き,カンマで区切られた三つの引 数を続けてください.@definfoencloseの最初の引数は(@がな い) @-コマンド名です.二番目の引数はInfoを開始するデリミタ文字列です. そして,三番目の引数はInfoを終了するデリミタ文字列です.デリミタ文字列は スペースを含めてもかまいません.開始と終了のデリミタは必須ではありません. 開始デリミタが不要で,終了デリミタが欲しい場合,コマンド名で同じ行に二つ のカンマを続ける必要があります.そうしない場合,Info書式化コマンドは,当 然,終了デリミタ文字列を開始デリミタ文字列だと誤って解釈します.

(@emph@strong@t,または@iのように)前 もって定義されているマクロ名で@definfoencloseする場合,囲まれた 定義は組込み定義に優先されます.

囲みコマンドはカッコ内の一つの引数を取り,以下のように定義されます.これ は,新しいマークアップコマンドを意図しています(see section 9. 単語と句の印付け).

例えば,以下のように書くことが可能です.

 
@definfoenclose phoo,//,\\

@phooの引数の前に`//',後ろに`\\'を挿入するInfo書式化コマンドと して@phooを定義するために,Texinfoファイルの最初の方に書きます. そして,Infoで強調された`//bar\\'が必要な場所ならどこでも, @phoo{bar}を書くことが可能です.

また,TeX書式化で以下のように書くことも可能でしょう.

 
@iftex
@global@let@phoo=@i
@end iftex

@phooをTeXに@phooの引数をイタリック対で植字させるコマ ンドとして@phooを定義します.

それぞれの定義は独自のフォーマッタに適用さます.一つはTeXに対し,もう1 つはtexinfo-format-buffertexinfo-format-regionに対するも のです.@definfoencloseコマンドは`@ifinfo'の中に書く必要は ありませんが,生のTeXコマンドは`@iftex'の中に書く必要があります.

もう一つの例です.以下のように書きます.

 
@definfoenclose headword, , :

@headwordの引数の前には何も挿入せず,後にコロンを挿入するInfo書 式化コマンドとして@headwordを定義するために,ファイルの最初の方 に書いてください.

`@definfoenclose'定義は,直接的または間接的に,再帰的してはいけま せん.


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by Akihiro Sagawa on January, 21 2003 using texi2html