数学作用素マクロ

ソースコード

      
        \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を用いてマクロを定義している.