名前: トノ 日時: 2007-03-19 15:55:49 IPアドレス: 58.0.13.*
>>47467 var. ?? や f. ?? をオプション引数として指定するようにするか、 その部分も含めた学名をベタに引数として指定するようにするかで 考え方も変わってくるように思います。 いずれにしろ、もう少し、学名の「仕様」をはっきりさせないと TeX マクロとしては作れないでしょう。 ※ 例えば、var. と f. と subsp. の出現順序とか‥‥ 以下は、その辺りが比較的単純であると仮定しての話ですが‥‥ オプション引数として指定する方法なら、var. は [] で括る、 f. は () で括る、と言うように、オプション引数の区切り方を 切替える方法があるかと思います。 オプション引数にしないなら、学名そのものをパターン・マッチングで 分解していくことになると思いますが、昔、某所で私がおねだりした パターンとよく似ているように思えるものの、それに応えて作っていただいた マクロの原理(引数のパターン・マッチングの取り方)が理解しきれていないので 応用が利かないという情けない状況です。 subsp. は抜きにして、var. と f. が両方現れる場合は var. が必ず 先に来る、var. や f. が重複して現れることがない、というような 前提でよければ、次のような強引な方法で切り抜けられるでしょうか。 \documentclass{article}\relax \makeatletter \def\gakumei#1{% \gakumei@check@f #1 f. \@nil \gakumei@check@v #1 var. \@nil \ifnum \gakumei@flag@f=\z@ \ifnum \gakumei@flag@v=\z@ \textit{#1}% \else \gakumei@v #1\@nil \fi \else \ifnum \gakumei@flag@v=\z@ \gakumei@f #1\@nil \else \gakumei@vf #1\@nil \fi \fi } \def\gakumei@check@f #1 f. #2\@nil{% \def\reserved@a{#2}% \ifx \reserved@a \@empty \chardef\gakumei@flag@f=\z@ \else \chardef\gakumei@flag@f=\@ne \fi } \def\gakumei@check@v #1 var. #2\@nil{% \def\reserved@a{#2}% \ifx \reserved@a \@empty \chardef\gakumei@flag@v=\z@ \else \chardef\gakumei@flag@v=\@ne \fi } \def\gakumei@v #1 var. #2\@nil{% \textit{#1\/ {\upshape var.}\ #2}% } \def\gakumei@f #1 f. #2\@nil{% \textit{#1\/ {\upshape f.}\ #2}% } \def\gakumei@vf #1 var. #2 f. #3\@nil{% \textit{#1\/ {\upshape var.}\ #2\/ {\upshape f.}\ #3}% } \makeatother \begin{document} \gakumei{Quercus mongolica} \gakumei{Quercus mongolica var. grosseserrata} \gakumei{Quercus mongolica f. finalpart} \gakumei{Quercus mongolica var. grosseserrata f. finalpart} \end{document}
この書き込みへの返事: