数学作用素マクロ
ソースコード
\let\Re\relax
\DeclareMathOperator{\Re}{Re}
\let\Im\relax
\DeclareMathOperator{\Im}{Im}
\makeatletter
\newcommand{\MyMathOperators}[1]{\@for\op:=#1\do{
\expandafter\edef\csname\op\endcsname{\noexpand\mathop{\noexpand\mathrm{\op}}\nolimits}
}}
\makeatother
\MyMathOperators{%
Ker,%
Coker,%
Hom,%
End,%
Aut,%
id,%
Gal,%
ch,%
ord,%
Spec,%
Specm,%
Frac,%
rank,%
corank,%
sgn,%
alg,%
Reg,%
Sel,%
Cl,%
lcm,%
gcd,%
Ann,%
alg,%
}
解説
例えば写像fの核(Kernel)をLaTeXで記述したい場合, ただ$Ker f$と書くと全て斜体になって見栄えが悪い(というかそれは文字式としてのK*e*r*fである). そのためフォントを適切に変更したり(Kerとfの間の)スペースを調整したりする必要がある. そんなときに\DeclareMathOperatorsというマクロを使用する.
\DeclareMathOperators{\Ker}{Ker}
このように記述することで$\Ker f$と入力すれば見栄えの良いちゃんとした数式が出力される. ではCokerやHomやEndといったものに対しても\DeclareMathOperatorsを使ってマクロを定義しようと思うと, ほとんど同じようなコードを大量に書く必要があり無駄が多い. そこでプリミティブなマクロを使用することでソースコードの記述量を減らすことができる. それが以下.
\makeatletter
\newcommand{\MyMathOperators}[1]{\@for\op:=#1\do{
\expandafter\edef\csname\op\endcsname{\noexpand\mathop{\noexpand\mathrm{\op}}\nolimits}
}}
\makeatother
\MyMathOperators{%
Ker,%
Coker,%
Hom,%
End,%
}
詳細の説明はしないが, \MyMathOperators変数に入れた文字に対してfor文を回し, \DeclareMathOperators{\Ker}{Ker}と等価な\mathop{Ker}\nolimitsを用いてマクロを定義している.