概要

$latex \LaTeX$ には物理数学全般の数式記述を簡単にするphysicsというパッケージがあります(PDF)。

MathJaxにもickcさんが移植されているのですが、何故か私の環境で異様に遅かったため(レンダリングに10秒以上かかる) 記法を変えて全文書き直しました。

MathJaxで動かすにあたって色々制限はありますが、煩わしい \left, \right から開放されるだけでも、導入する 価値があると思われます。

インストール

設定ファイルの作成

以下のマクロをコピーして、ご自分のサーバー上に設置します。

ファイル名、ディレクトリに制限はありません。拡張子は .js にしてください。

MathJax.Hub.Config({
    TeX:{
        Macros: {
            /* automatic bracing */
            quantity:             ['{\\left\\{ #1 \\right\\}', 1],
            qty:                  ['{\\left( #1 \\right)}', 1],
            pqty:                 ['{\\left( #1 \\right)}', 1],
            bqty:                 ['{\\left[ #1 \\right]}', 1],
            vqty:                 ['{\\left\\vert #1 \\right\\vert}', 1],
            Bqty:                 ['{\\left\\{ #1 \\right\\}}', 1],

            absolutevalue:        ['{\\left\\vert #1 \\right\\vert}', 1],
            abs:                  ['{\\left\\vert #1 \\right\\vert}', 1],
            norm:                 ['{\\left\\Vert #1 \\right\\Vert}', 1],
            evaleted:             ['{\\left. #1 \\vphantom{\\frac{a}{a}} \\right\\vert}', 1],
            eval:                 ['{\\left. #1 \\vphantom{\\frac{a}{a}} \\right\\vert}', 1],

            order:                ['{\\mathcal{O}\\left( #1 \\right)}', 1],

            commutator:           ['{\\left[ #1 , #2 \\right]}', 2],
            comm:                 ['{\\left[ #1 , #2 \\right]}', 2],
            anticommutator:       ['{\\left\\{ #1 , #2 \\right\\}}', 2],
            acomm:                ['{\\left\\{ #1 , #2 \\right\\}}', 2],
            poissonbracket:       ['{\\left\\{ #1 , #2 \\right\\}}', 2],
            pb:                   ['{\\left\\{ #1 , #2 \\right\\}}', 2],

            /* vector notation */
            vectorbold:           ['{\\boldsymbol{ #1 }}', 1],
            vb:                   ['{\\boldsymbol{ #1 }}', 1],
            vectorarrow:          ['{\\boldsymbol{\\vec{ #1 }}}', 1],
            va:                   ['{\\boldsymbol{\\vec{ #1 }}}', 1],
            vectorunit:           ['{\\boldsymbol{\\hat{ #1 }}}', 1],
            vu:                   ['{\\boldsymbol{\\hat{ #1 }}}', 1],

            dotproduct:           ['{\\boldsymbol{\\cdot}}'],
            vdot:                 ['{\\boldsymbol{\\cdot}}'],
            crossproduct:         ['{\\boldsymbol{\\times}}'],
            cross:                ['{\\boldsymbol{\\times}}'],
            cp:                   ['{\\boldsymbol{\\times}}'],

            gradient:             ['{\\nabla}'],
            grad:                 ['{\\nabla}'],
            divergence:           ['{\\nabla\\vdot}'],
            div:                  ['{\\nabla\\vdot}'],
            curl:                 ['{\\nabla\\cross}'],
            rotation:             ['{\\nabla\\cross}'],
            rot:                  ['{\\nabla\\cross}'],
            laplacian:            ['{\\nabla^2}'],

            /* operators */
            // trigometric
            sin:                  ['{\\operatorname{sin}^{#1}     \\left( #2 \\right)}', 2, ""],
            cos:                  ['{\\operatorname{cos}^{#1}     \\left( #2 \\right)}', 2, ""],
            tan:                  ['{\\operatorname{tan}^{#1}     \\left( #2 \\right)}', 2, ""],
            csc:                  ['{\\operatorname{csc}^{#1}     \\left( #2 \\right)}', 2, ""],
            sec:                  ['{\\operatorname{sec}^{#1}     \\left( #2 \\right)}', 2, ""],
            cot:                  ['{\\operatorname{cot}^{#1}     \\left( #2 \\right)}', 2, ""],

            arcsin:               ['{\\operatorname{arcsin}^{#1}  \\left( #2 \\right)}', 2, ""],
            arccos:               ['{\\operatorname{arccos}^{#1}  \\left( #2 \\right)}', 2, ""],
            arctan:               ['{\\operatorname{arctan}^{#1}  \\left( #2 \\right)}', 2, ""],
            arccsc:               ['{\\operatorname{arccsc}^{#1}  \\left( #2 \\right)}', 2, ""],
            arcsec:               ['{\\operatorname{arcsec}^{#1}  \\left( #2 \\right)}', 2, ""],
            arccot:               ['{\\operatorname{arccot}^{#1}  \\left( #2 \\right)}', 2, ""],

            asin:                 ['{\\operatorname{arcsin}^{#1}  \\left( #2 \\right)}', 2, ""],
            acos:                 ['{\\operatorname{arccos}^{#1}  \\left( #2 \\right)}', 2, ""],
            atan:                 ['{\\operatorname{arctan}^{#1}  \\left( #2 \\right)}', 2, ""],
            acsc:                 ['{\\operatorname{arccsc}^{#1}  \\left( #2 \\right)}', 2, ""],
            asec:                 ['{\\operatorname{arcsec}^{#1}  \\left( #2 \\right)}', 2, ""],
            acot:                 ['{\\operatorname{arccot}^{#1}  \\left( #2 \\right)}', 2, ""],            

            // hypar bolic                          
            sinh:                 ['{\\operatorname{sinh}^{#1}    \\left( #2 \\right)}', 2, ""],
            cosh:                 ['{\\operatorname{cosh}^{#1}    \\left( #2 \\right)}', 2, ""],
            tanh:                 ['{\\operatorname{tanh}^{#1}    \\left( #2 \\right)}', 2, ""],
            csch:                 ['{\\operatorname{csch}^{#1}    \\left( #2 \\right)}', 2, ""],
            sech:                 ['{\\operatorname{sech}^{#1}    \\left( #2 \\right)}', 2, ""],
            coth:                 ['{\\operatorname{coth}^{#1}    \\left( #2 \\right)}', 2, ""],

            arcsinh:              ['{\\operatorname{arcsinh}^{#1} \\left( #2 \\right)}', 2, ""],
            arccosh:              ['{\\operatorname{arccosh}^{#1} \\left( #2 \\right)}', 2, ""],
            arctanh:              ['{\\operatorname{arctanh}^{#1} \\left( #2 \\right)}', 2, ""],
            arccsch:              ['{\\operatorname{arccsch}^{#1} \\left( #2 \\right)}', 2, ""],
            arcsech:              ['{\\operatorname{arcsech}^{#1} \\left( #2 \\right)}', 2, ""],
            arccoth:              ['{\\operatorname{arccoth}^{#1} \\left( #2 \\right)}', 2, ""],

            asinh:                ['{\\operatorname{arcsinh}^{#1} \\left( #2 \\right)}', 2, ""],
            acosh:                ['{\\operatorname{arccosh}^{#1} \\left( #2 \\right)}', 2, ""],
            atanh:                ['{\\operatorname{arctanh}^{#1} \\left( #2 \\right)}', 2, ""],
            acsch:                ['{\\operatorname{arccsch}^{#1} \\left( #2 \\right)}', 2, ""],
            asech:                ['{\\operatorname{arcsech}^{#1} \\left( #2 \\right)}', 2, ""],
            acoth:                ['{\\operatorname{arccoth}^{#1} \\left( #2 \\right)}', 2, ""],

            // other
            exp:                  ['{\\operatorname{exp} \\left[ #1 \\right]}', 1],
            log:                  ['{\\operatorname{log} \\left( #1 \\right)}', 1],
            ln:                   ['{\\operatorname{ln}  \\left( #1 \\right)}', 1],
            det:                  ['{\\operatorname{det} \\left( #1 \\right)}', 1],
            Pr:                   ['{\\operatorname{Pr}  \\left( #1 \\right)}', 1],

            // new operators
            trace:                ['{\\operatorname{tr}   \\left( #1 \\right)}', 1],
            tr:                   ['{\\operatorname{tr}   \\left( #1 \\right)}', 1],
            Trace:                ['{\\operatorname{Tr}   \\left( #1 \\right)}', 1],
            Tr:                   ['{\\operatorname{Tr}   \\left( #1 \\right)}', 1],
            rank:                 ['{\\operatorname{rank} \\left( #1 \\right)}', 1],
            erf:                  ['{\\operatorname{erf}  \\left( #1 \\right)}', 1],
            Res:                  ['{\\operatorname{Res}  \\left( #1 \\right)}', 1],
            principalvalue:       ['{\\mathcal{P}}'],
            pv:                   ['{\\mathcal{P}}'],
            PV:                   ['{\\operatorname{P.V.}}'],
            Re:                   ['{\\operatorname{Re} \\left[ #1 \\right]}', 1],
            Im:                   ['{\\operatorname{Im} \\left[ #1 \\right]}', 1],

            /* quick quad text */
            qqtext:               ['{\\quad\\text{#1}        \\quad}', 1, ""],
            qq:                   ['{\\quad\\text{#1}        \\quad}', 1, ""],
            qcomma:               ['{      \\text{,}         \\quad}'],
            qc:                   ['{      \\text{,}         \\quad}'],
            qcc:                  ['{\\quad\\text{c.c.}      \\quad}'],
            qif:                  ['{\\quad\\text{if}        \\quad}'],
            qthen:                ['{\\quad\\text{then}      \\quad}'],
            qelse:                ['{\\quad\\text{else}      \\quad}'],
            qotherwise:           ['{\\quad\\text{otherwise} \\quad}'],
            qunless:              ['{\\quad\\text{unless}    \\quad}'],
            qgiven:               ['{\\quad\\text{qiven}     \\quad}'],
            qusing:               ['{\\quad\\text{using}     \\quad}'],
            qassume:              ['{\\quad\\text{assume}    \\quad}'],
            qsince:               ['{\\quad\\text{since}     \\quad}'],
            qlet:                 ['{\\quad\\text{let}       \\quad}'],
            qfor:                 ['{\\quad\\text{for}       \\quad}'],
            qall:                 ['{\\quad\\text{all}       \\quad}'],
            qeven:                ['{\\quad\\text{even}      \\quad}'],
            qodd:                 ['{\\quad\\text{odd}       \\quad}'],
            qinteger:             ['{\\quad\\text{integer}   \\quad}'],
            qand:                 ['{\\quad\\text{and}       \\quad}'],
            qor:                  ['{\\quad\\text{or}        \\quad}'],
            qas:                  ['{\\quad\\text{as}        \\quad}'],
            qin:                  ['{\\quad\\text{in}        \\quad}'],

            /* derivatives */
            diferential:          ['{\\ \\mathrm{d}^{ #1 } #2 \\ }', 2, ""],
            dd:                   ['{\\ \\mathrm{d}^{ #1 } #2 \\ }', 2, ""],
            derivative:           ['{\\frac{\\mathrm{d}^{ #1 }{ #2 }}{\\mathrm{d}{ #3 }^{ #1 }}}', 3, ""],
            dv:                   ['{\\frac{\\mathrm{d}^{ #1 }{ #2 }}{\\mathrm{d}{ #3 }^{ #1 }}}', 3, ""],
            partialderivative:    ['{\\frac{\\partial^{ #1 }{ #2 }}{\\partial{ #3 }^{ #1 }}}', 3, ""],
            pdv:                  ['{\\frac{\\partial^{ #1 }{ #2 }}{\\partial{ #3 }^{ #1 }}}', 3, ""],
            varidation:           ['{\\delta}'],
            "var":                ['{\\delta}'],
            functionalderivative: ['{\\frac{\\delta{ #1 }}{\\delta{ #2 }}}', 2],
            fdv:                  ['{\\frac{\\delta{ #1 }}{\\delta{ #2 }}}', 2],

            /* dirac bra-ket notation */
            bra:                  ['{\\left\\langle{ #1 }\\right\\vert}', 1],
            ket:                  ['{\\left\\vert  { #1 }\\right\\rangle}', 1],
            innerproduct:         ['{\\left\\langle{ #1 }\\mid { #2 }\\right\\rangle}', 2],
            ip:                   ['{\\left\\langle{ #1 }\\mid { #2 }\\right\\rangle}', 2],
            braket:               ['{\\left\\langle{ #1 }\\mid { #2 }\\right\\rangle}', 2],
            outerproduct:         ['{\\left\\vert  { #1 }\\right\\rangle\\left\\langle{ #2 }\\right\\vert}', 2],
            op:                   ['{\\left\\vert  { #1 }\\right\\rangle\\left\\langle{ #2 }\\right\\vert}', 2],
            dyad:                 ['{\\left\\vert  { #1 }\\right\\rangle\\left\\langle{ #2 }\\right\\vert}', 2],
            ketbra:               ['{\\left\\vert  { #1 }\\right\\rangle\\left\\langle{ #2 }\\right\\vert}', 2],
            expectationvalue:     ['{\\left\\langle{ #1 }\\right\\rangle}', 1],
            ev:                   ['{\\left\\langle{ #1 }\\right\\rangle}', 1],
            matrixelement:        ['{\\left\\langle{ #1 }\\middle|{ #2 }\\middle|{ #3 }\\right\\rangle}', 3],
            matrixel:             ['{\\left\\langle{ #1 }\\middle|{ #2 }\\middle|{ #3 }\\right\\rangle}', 3],
            mel:                  ['{\\left\\langle{ #1 }\\middle|{ #2 }\\middle|{ #3 }\\right\\rangle}', 3],
        }
    }
}

すでにMathJaxの設定ファイルがある場合は、適宜省略しても構いません。 僕の設定ファイルはこのようになっており、http://conao3.com/mathjax/option/MathJaxOption.jsに設置しています。

MathJax.Hub.Config({
    "HTML-CSS":{
        scale:120
    },
    tex2jax:{
        inlineMath:  [['$latex' , '$'], ['\\(' , '\\)']],
        displayMath: [['$$' , '$$'], ['\[' , '\]']],
        processEscapes: true
    },
    TeX:{
        Macros: {
            /* classies */
            N:                    ['{\\mathbb N}'],
            Z:                    ['{\\mathbb Z}'],
            Q:                    ['{\\mathbb Q}'],
            R:                    ['{\\mathbb R}'],
            C:                    ['{\\mathbb C}'],

            /* automatic bracing */
            quantity:             ['{\\left\\{ #1 \\right\\}', 1],
            // ...
        }
    }
});

ヘッダーの編集

<head> タグのすぐ下に以下のコードを追記します。URLは適宜変更してください。 修正せずに直接私のファイルを参照するのは禁止します。

<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS_HTML"></script>
<script type="text/javascript" src="http://conao3.com/mathjax/option/MathJaxOption.js"></script>

サポートされている記法

基本的にphysicsのPDFに沿って作っています。

web用のLaTeXコードとコンパイルする用のLaTeXコードが違うのはカオスなので、web用のLaTeXコードをそのまま コンパイルしても通るように作っています。( \rot に限り、 physics.sty がサポートしていないので、 定義する必要があります。)

制限されている記法については下の差異を参照してください。

下のテストは右クリックして、 Show Math As -> TeX Commands で実際どのように書かれているのか見ることが出来ます。

テスト

\begin{align*} \qty{\ } \end{align*}
\begin{align*} \qty{\frac{x}{y}} \end{align*}
\begin{align*} \qty{\frac{1}{1+\frac{1}{x}}} \end{align*}
\begin{align*} \bqty{\frac{x}{y}} \end{align*}
\begin{align*} \Bqty{\frac{x}{y}} \end{align*}
\begin{align*} \vqty{\frac{x}{y}} \end{align*}
\begin{align*} \C \end{align*}
\begin{align*} \abs{a} \end{align*}
\begin{align*} \abs{\frac{x}{y}} \end{align*}
\begin{align*} \norm{a} \end{align*}
\begin{align*} \eval{x}_0^\infty \end{align*}
\begin{align*} \eval{\frac{x}{y}}_0^\infty \end{align*}
\begin{align*} \order{x^2} \end{align*}
\begin{align*} \comm{\frac{a}{b}}{a} \end{align*}
\begin{align*} \pb{\frac{a}{b}}{a} \end{align*}
\begin{align*} \vb{a} \end{align*}
\begin{align*} \va{a} \end{align*}
\begin{align*} \vu{a} \end{align*}
\begin{align*} \vdot \end{align*}
\begin{align*} \cross \end{align*}
\begin{align*} \grad\vb{E} \end{align*}
\begin{align*} \div\vb{E} \end{align*}
\begin{align*} \curl\vb{E} \end{align*}
\begin{align*} \rot\vb{E} \end{align*}
\begin{align*} \laplacian\vb{E} \end{align*}
\begin{align*} \cos{\frac{a}{b}} \end{align*}
\begin{align*} \cos[2]{\frac{a}{b}} \end{align*}
\begin{align*} \sin{\frac{a}{b}} \end{align*}
\begin{align*} \sin[2]{\frac{a}{b}} \end{align*}
\begin{align*} \sin x \end{align*}
\begin{align*} \dd xa \end{align*}
\begin{align*} \dd[2]xa \end{align*}
\begin{align*} \dd[2]{x}a \end{align*}
\begin{align*} \exp x \diferential[2]{x}a \end{align*}
\begin{align*} \dv{f}{x} \end{align*}
\begin{align*} \dv[2]{f}{x} \end{align*}
\begin{align*} \dv{f} a \end{align*}
\begin{align*} \var{F[g(x)]} \end{align*}
\begin{align*} 1\qor2 \end{align*}

差異

qty

MathJaxがif文を使用できない関係で、普通の波括弧しか引数指定に使えません。 そのため、 \qty(), \qty[], \qty|| が使用できません。 同様動作の \pqty{}, \bpqy{}, \vpqy{} を使用してください。

しかし、丸括弧のほうが使用頻度が高いと思うので、デフォルトの動作を丸括弧にしてます。

通常の physics.sty の場合、 \qty{} で波括弧が出力されますが、 physics.js の場合、丸括弧になります。

波括弧を出したい場合、 \Bpqy{} を使用してください。

eval, gradなど

qtyと同じ理由で、evalなどの変形である \eval(, \eval[ は非対応。

rot

curlは別名で、rotationとも言う。 \curl{} と同様動作の \rotation{}, \rot{} を定義しました。

exp, Re, Im

自分的な好みで、カッコの種類を角カッコに変えています。

grad, div, curl(rot)

自分的な好みで、ナブラを太字にしていません。

derivative, partialderivative

可変の引数を取れない関係で、 \dv{X}, \pdv{x}, \pdv{f}{x}{y} は非対応。