LaTeX Workshop の数式プレビューを使いこなす

# LaTeX Workshop の数式プレビューを使いこなす

:::note info
[LaTeX Workshop | James Yu](https://marketplace.visualstudio.com/items?itemName=James-Yu.latex-workshop)
投稿時: ver.8.23.0 (2021/1 現在)、最終更新時: **ver.8.29.0**
:::

LaTeX Workshop の魅力的な機能の 1 つとして、数式をプレビューする機能がある。この機能は MathJax を利用して数式を表示している。
以下のような感じ。

![mathHoverPreview](https://i.gyazo.com/68691c1b47c692f9784da28c39752fa7.gif)

LaTeX Workshop では 8.23.0 の更新を期に MathJax が 3.2 となり、さまざまなパッケージを読み込むことが出来るようになった。

## ■ 使い方

> [\# Previewing equations \- Hover \- James-Yu/LaTeX-Workshop Wiki](https://github.com/James-Yu/LaTeX-Workshop/wiki/Hover#previewing-equations)

数式プレビューにはホバーとプレビューパネルの 2 つがある。

- ホバー (On the fly)

    > マウスカーソルを数式環境の `\begin{...}` の上に持ってくる
- プレビューパネル (Realtime math preview panel)

    > `Ctrl+Alt+M` (`Cmd+Alt+M`) を押下するか、コマンドパレットから以下を入力する

    ```
    > LaTeX Workshop: Open Math Preview Panel
    ```

プレビューパネルではリアルタイムに様子を確認できるので見ながら編集出来て便利。

これらの数式プレビューに対応している数式環境は以下の通り。

| `\[`, `$`, `$$`, array, subarray, eqnarray(\*), equation(\*), align(\*), alignat(\*), gather(\*), multline(\*), cases, split, aligned, alignedat, gathered, matrix, smallmatrix, bmatrix, Bmatrix, pmatrix, vmatrix, Vmatrix |
| :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

また、ホバープレビューの表示の大きさやカーソルの形や色などをカスタマイズしたい場合には以下を参照。プレビューパネルの表示位置も変更可能。

> [\# 数式 \- LaTeX Workshop をもっと使いこなす \- Qiita](https://qiita.com/Yarakashi_Kikohshi/items/1f2225c7e28aad498998#-数式)

## ■ 拡張カスタマイズ

MathJax 3.2 となったことで、さまざまな拡張を読み込むことが出来るようになった。

> [\# `latex-workshop.hover.preview.mathjax.extensions` \- Hover \- James-Yu/LaTeX-Workshop Wiki](https://github.com/James-Yu/LaTeX-Workshop/wiki/Hover#latex-workshophoverpreviewmathjaxextensions)

拡張の詳細は以下の MathJax 公式ドキュメントを参照してほしい。また、以下の表内の拡張の列にそれぞれのドキュメントのリンクを埋め込んでおいた。

> [The TeX/LaTeX Extension List \- MathJax 3.2 documentation](https://docs.mathjax.org/en/latest/input/tex/extensions/index.html)

LaTeX Workshop では、デフォルトで次のような 5 つの拡張を読み込む。これらのデフォルトで読み込まれる拡張は無効化できない。

|                                          拡張                                           | 説明                                                                                                            |
| :-------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------- |
|         [ams](https://docs.mathjax.org/en/latest/input/tex/extensions/ams.html)         | LaTeX の [AMSmath](https://www.ctan.org/pkg/amsmath) パッケージと [amsfonts](https://www.ctan.org/pkg/amsfonts) |
|       [color](https://docs.mathjax.org/en/latest/input/tex/extensions/color.html)       | LaTeX の [color](https://www.ctan.org/pkg/color) パッケージ                                                     |
|  [newcommand](https://docs.mathjax.org/en/latest/input/tex/extensions/newcommand.html)  | `\newcommand` や `\newenvironment` などを利用可能にする                                                         |
|    [noerrors](https://docs.mathjax.org/en/latest/input/tex/extensions/noerrors.html)    | TeX のエラーを表示せずにコードをそのまま表示                                                                    |
| [noundefined](https://docs.mathjax.org/en/latest/input/tex/extensions/noundefined.html) | 未定義のコマンドをコマンド名のまま表示                                                                          |

また、追加で次のような 17 の LaTeX に関する拡張を読み込むことが出来る。
LaTeX のパッケージ名の拡張は、そのままパッケージのコマンドが使えるようになっている。

|                                         拡張                                          | 説明                                                                  |
| :-----------------------------------------------------------------------------------: | :-------------------------------------------------------------------- |
|      [amscd](https://docs.mathjax.org/en/latest/input/tex/extensions/amscd.html)      | AMSmath による CD 環境                                                |
| [boldsymbol](https://docs.mathjax.org/en/latest/input/tex/extensions/boldsymbol.html) | AMSmath による `\boldsymbol`                                          |
|     [braket](https://docs.mathjax.org/en/latest/input/tex/extensions/braket.html)     | LaTeX の [braket](https://www.ctan.org/pkg/braket) パッケージ         |
| [bussproofs](https://docs.mathjax.org/en/latest/input/tex/extensions/bussproofs.html) | LaTeX の [bussproofs](https://www.ctan.org/pkg/bussproofs) パッケージ |
|     [cancel](https://docs.mathjax.org/en/latest/input/tex/extensions/cancel.html)     | LaTeX の [cancel](https://www.ctan.org/pkg/cancel) パッケージ         |
|      [cases](https://docs.mathjax.org/en/latest/input/tex/extensions/cases.html)      | LaTeX の [cases](https://www.ctan.org/pkg/cases) パッケージ           |
|  [centernot](https://docs.mathjax.org/en/latest/input/tex/extensions/centernot.html)  | LaTeX の [centernot](https://www.ctan.org/pkg/centernot) パッケージ   |
|   [colortbl](https://docs.mathjax.org/en/latest/input/tex/extensions/colortbl.html)   | LaTeX の [colortbl](https://www.ctan.org/pkg/colortbl) パッケージ     |
|     [empheq](https://docs.mathjax.org/en/latest/input/tex/extensions/empheq.html)     | LaTeX の [empheq](https://www.ctan.org/pkg/empheq) パッケージ         |
|    [gensymb](https://docs.mathjax.org/en/latest/input/tex/extensions/gensymb.html)    | LaTeX の [gensymb](https://www.ctan.org/pkg/gensymb) パッケージ       |
|  [mathtools](https://docs.mathjax.org/en/latest/input/tex/extensions/mathtools.html)  | LaTeX の [mathtools](https://www.ctan.org/pkg/mathtools) パッケージ   |
|     [mhchem](https://docs.mathjax.org/en/latest/input/tex/extensions/mhchem.html)     | LaTeX の [mhchem](https://www.ctan.org/pkg/mhchem) パッケージ         |
|    [physics](https://docs.mathjax.org/en/latest/input/tex/extensions/physics.html)    | LaTeX の [physics](https://www.ctan.org/pkg/physics) パッケージ       |
|   [textcomp](https://docs.mathjax.org/en/latest/input/tex/extensions/textcomp.html)   | LaTeX の [textcomp](https://www.ctan.org/pkg/textcomp) パッケージ     |
| [textmacros](https://docs.mathjax.org/en/latest/input/tex/extensions/textmacros.html) | `\text` コマンド内のテキストモードの文字装飾を処理                    |
|    [upgreek](https://docs.mathjax.org/en/latest/input/tex/extensions/upgreek.html)    | LaTeX の [upgreek](https://www.ctan.org/pkg/upgreek) パッケージ       |
|       [verb](https://docs.mathjax.org/en/latest/input/tex/extensions/verb.html)       | `\verb` を利用可能に                                                  |

また、以下 5 つの拡張も読み込むことが出来る。

|                                       拡張                                        | 説明                                                     |
| :-------------------------------------------------------------------------------: | :------------------------------------------------------- |
|     [bbox](https://docs.mathjax.org/en/latest/input/tex/extensions/bbox.html)     | 数式の背景や枠線の追加                                   |
|  [enclose](https://docs.mathjax.org/en/latest/input/tex/extensions/enclose.html)  | ボックスや楕円、取り消し線などのマーカー <br> MathML より |
| [extpfeil](https://docs.mathjax.org/en/latest/input/tex/extensions/extpfeil.html) | 矢印の生成                                               |
|     [html](https://docs.mathjax.org/en/latest/input/tex/extensions/html.html)     | HTML のリンク機能                                        |
|  [unicode](https://docs.mathjax.org/en/latest/input/tex/extensions/unicode.html)  | Unicode による文字の指定                                 |

これら 22 の拡張は `latex-workshop.hover.preview.mathjax.extensions` から追加することが出来る。

```json
  "latex-workshop.hover.preview.mathjax.extensions": [
    "boldsymbol",
    "empheq",
    "mathtools",
    "physics",
    "textmacros",
  ],
```

多く読み込むと動作が遅くなる可能性があると思われるので、使わないだろう拡張はむやみに読み込まない方が良い。それか処理性能の高い PC に買い換えよう。

ちなみに、[MathJax の拡張機能のリスト](https://docs.mathjax.org/en/latest/input/tex/extensions/index.html) と比較すると次のような拡張は利用できないらしい。数式プレビューをしたい場合には特に必要はないと思われる。

| 利用できない拡張                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [action](https://docs.mathjax.org/en/latest/input/tex/extensions/action.html)、[autoload](https://docs.mathjax.org/en/latest/input/tex/extensions/autoload.html)、[colorv2](https://docs.mathjax.org/en/latest/input/tex/extensions/colorv2.html)、[configmacros](https://docs.mathjax.org/en/latest/input/tex/extensions/configmacros.html)、[require](https://docs.mathjax.org/en/latest/input/tex/extensions/require.html)、[setoptions](https://docs.mathjax.org/en/latest/input/tex/extensions/setoptions.html)、[tagformat](https://docs.mathjax.org/en/latest/input/tex/extensions/tagformat.html) |

## ■ 表示できないコマンドの対応

基本的に、LaTeX ドキュメント内で `\newcommand` されたコマンドは自動的に読まれて数式プレビューへ引き渡されるようになっている。そのため、`\newcommand` されていても上の拡張によって解釈されるコマンドに関しては問題なくプレビューに反映されることとなる。

しかし、これらの拡張でサポートされないコマンドを利用する場合、途端に上手くいかなくなる。

![bm-error](https://i.gyazo.com/7e716dfeec61b28ad5afbd282593b73a.png)

これは数式プレビュー専用に新しくコマンドを定義することで解決する。

まずは、適当なディレクトリに適当な名前の TeX ファイルを置く。今回は hover\.tex とした。
これを以下の設定で絶対パスによって指定する。

```json
  "latex-workshop.hover.preview.newcommand.newcommandFile": "X:appropriate\\path\\to\\hover.tex",
```

このファイル内で `\newcommmand` したものが、数式プレビュー内に利用される。

経験則的には、ここで指定したファイルが最初に読み込まれるらしい。また、コメントアウトも有効。

### ！注意

この数式プレビューで表示できるコマンドには限りがある。そのため、ある程度は許容する必要がある。最悪、赤文字でコマンド名がそのまま出ないようにするくらいだろう。

また、LaTeX 本文で出力する結果を MathJax で提供されているコマンドで再現できるものしか対応することが出来ない。これはすなわち、「実現したいコマンドの出力」が「MathJax でサポートしているコマンドで再現できるか」知っている必要がある。

MathJax から提供されているコマンド一覧は以下を参照すれば良い。

> [Supported TeX/LaTeX commands \- MathJax 3.2 documentation](https://docs.mathjax.org/en/latest/input/tex/macros/index.html)

加えて、次のような場合にはどのように対処しても表示が難しいと思われる。

- newpxmath などの異なるフォントへの変更

    > デフォルトの MathJax TeX から変更不可

- `[]` で囲まれたオプション引数付きコマンドの定義、`*` 付きのコマンドの定義

    > xparse パッケージによる定義は使えない

- `\let` を利用した再帰的な定義

    > [`\let` handled incorrectly \- Issue \#2404 \- mathjax/MathJax](https://github.com/mathjax/MathJax/issues/2404)

また、パッケージにオプションがある場合、これを変更する手続きは提供されていない。そのため、physics パッケージでは `d` がイタリックに変更できないなどのちょっとした問題は残る。（プレビューするだけなので、そこまでこだわる必要はないと思われるが）

### ▽ 具体例

> bm パッケージから提供される `\bm` を太字斜体で表示させたい

MathJax で利用できるコマンドのうち、太字斜体のコマンドは boldsymbol 拡張の `\boldsymbol` コマンドだろう。したがって、数式プレビューには `\bm` の本体は `\boldsymbol` だと思ってもらえば、見た目上変わらないものになる。

上の設定から boldsymbol 拡張を有効にしておいて、hover\.tex 内で `\boldsymbol` を `\bm` で定義する。

```latex
% hover.tex
\newcommand{\bm}[1]{\boldsymbol{#1}}
```

すると、数式プレビュー側は bm パッケージの存在を知らなくとも `\bm` を太字斜体の文字に解釈してくれる。

![bm-success](https://i.gyazo.com/32e5252e09841426620b3f1b5a014927.png)

当然ながら、LaTeX はこのファイルの存在をルートファイルから知ることは出来ないので、普通に bm パッケージを利用して `\bm` することが出来る。

**その他の例:**

<details>
<summary>newpxmath などの <code>\coloneq</code> に対応する（折りたたみ）</summary>
<div>

newpxmath などでは “≔” を `\coloneq` と定義しているが、mathtools 拡張を読み込んでいると `\coloneq` は “:-” と表示されてしまう。次のように定義しておけば、`\coloneq` でも “≔” で表示されることになる。

```latex
% hover.tex
\newcommand{\coloneq}{\coloneqq}
```

本来、LaTeX では `\renewcommand` を利用すべきだと思われるが、`\newcommand` でも出来る。MathJax の不思議な仕様。

</div></details>

<details>
<summary>upgreek 拡張を利用して newpxmath などの立体ギリシャ文字に対応する（折りたたみ）</summary>
<div>

いくつかのコマンドはコメントアウトしている。コメントアウトしているギリシャ文字が必要に感じた場合は、unicode 拡張から符号位置を指定すると良いだろう。

```latex
% hover.tex
%%
%% lowercase
\newcommand{\alphaup}{\upalpha}
\newcommand{\betaup}{\upbeta}
\newcommand{\gammaup}{\upgamma}
\newcommand{\deltaup}{\updelta}
\newcommand{\epsilonup}{\upepsilon}
\newcommand{\zetaup}{\upzeta}
\newcommand{\etaup}{\upeta}
\newcommand{\thetaup}{\uptheta}
\newcommand{\iotaup}{\upiota}
\newcommand{\kappaup}{\upkappa}
\newcommand{\lambdaup}{\uplambda}
\newcommand{\muup}{\upmu}
\newcommand{\nuup}{\upnu}
\newcommand{\xiup}{\upxi}
% \newcommand{\omicronup}{}
\newcommand{\piup}{\uppi}
\newcommand{\rhoup}{\uprho}
\newcommand{\sigmaup}{\upsigma}
\newcommand{\tauup}{\uptau}
\newcommand{\upsilonup}{\upupsilon}
\newcommand{\phiup}{\upphi}
\newcommand{\chiup}{\upchi}
\newcommand{\psiup}{\uppsi}
\newcommand{\omegaup}{\upomega}
%%
%% variant lowercase
\newcommand{\varepsilonup}{\upvarepsilon}
\newcommand{\varthetaup}{\upvartheta}
% \newcommand{\varkappaup}{}
\newcommand{\varpiup}{\upvarpi}
\newcommand{\varrhoup}{\upvarrho}
\newcommand{\varsigmaup}{\upvarsigma}
\newcommand{\varphiup}{\upvarphi}
%%
%% Uppercase
% \newcommand{\Alphaup}{}
% \newcommand{\Betaup}{}
\newcommand{\Gammaup}{\Upgamma}
\newcommand{\Deltaup}{\Updelta}
% \newcommand{\Epsilonup}{}
% \newcommand{\Zetaup}{}
% \newcommand{\Etaup}{}
\newcommand{\Thetaup}{\Uptheta}
% \newcommand{\Iotaup}{}
% \newcommand{\Kappaup}{}
\newcommand{\Lambdaup}{\Uplambda}
% \newcommand{\Muup}{}
% \newcommand{\Nuup}{}
\newcommand{\Xiup}{\Upxi}
% \newcommand{\Omicronup}{}
\newcommand{\Piup}{\Uppi}
% \newcommand{\Rhoup}{}
\newcommand{\Sigmaup}{\Upsigma}
% \newcommand{\Tauup}{}
\newcommand{\Upsilonup}{\Upupsilon}
\newcommand{\Phiup}{\Upphi}
% \newcommand{\Chiup}{}
\newcommand{\Psiup}{\Uppsi}
\newcommand{\Omegaup}{\Upomega}
```

</div></details>

<details>
<summary>slashed パッケージの対応（折りたたみ）</summary>
<div>

centernot 拡張を利用して対応する。

```latex
% hover.tex
\newcommand{\slashed}[1]{\centernot{#1}}
```

</div></details>

<details>
<summary>siunitx パッケージによる単位の対応（折りたたみ）</summary>
<div>

gensymb パッケージからいくつか対応することが出来る。

| Command by gensymb | Symbol sample |
| :----------------: | :-----------: |
|     `\degree`      |       °       |
|     `\celsius`     |       ℃       |
|   `\perthousand`   |       ‱       |
|       `\ohm`       |       Ω       |
|      `\micro`      |       µ       |

残りは `\mathrm` で対応すれば良いだろう。プレビューするだけなので、そこまでこだわる必要もないと思われる。

もちろん、その他の特殊な単位記号があれば unicode 拡張で符号させておけば良いだろう。

</div></details>

<details>
<summary>esvect パッケージによる矢印ベクトルの対応（折りたたみ）</summary>
<div>

esvect では矢印のアクセントを付けることが出来る。また、矢印のスタイルを変更することも出来る。MathJax ではこれに対応する拡張は存在しないため、類似した `\overrightarrow` を利用すれば良いだろう。

```latex
% hover.tex
\newcommand{\vv}[1]{\overrightarrow{#1}}
```

ただし、残念なことに `\vv*` を定義することは出来ないようだ。

</div>
</details>

### ▽ 装飾や新しい記号

`latex-workshop.hover.preview.mathjax.extensions` で導入できる拡張には、数式プレビューに装飾を加えることのできるものもある。color 拡張や bbox 拡張を利用して数式を装飾・強調することが出来る。
大げさな装飾を付けると後に混乱する可能性があることは注意が必要になるだろう。

<details>
<summary> 特定のコマンドを装飾・強調する（折りたたみ）</summary>
<div>

たとえば、太字斜体に色付けで装飾したい場合。

color 拡張でオレンジにしてみた。（赤にするとエラーとの判別が付きづらくなるので避けた）

```latex
% hover.tex
\newcommand{\bm}[1]{{\color{orange}\boldsymbol{#1}}}
% `\color'は全体を `{}'で囲う必要がある。囲わないと色が漏れる。
```

![colored bm](https://i.gyazo.com/5f0f85d7b2f15f9e8492ef206d2bc67b.png)

もちろん、LaTeX 側の文章は通常通りの黒色で太字斜体となる。見た目で判断するのが難しい場合にはこのようにしていると見分けが付きやすいだろう。

場合によっては、bbox 拡張や enclose 拡張を利用してより豪華な装飾を施すことも出来るだろう。ただし、これらの装飾はタイプセットされる LaTeX ファイルにはまったく影響のないものであることを忘れないでおきたい。

</div></details>

また、unicode 拡張では文字や記号を Unicode から指定することが出来る。それっぽい形の記号をコマンドとして定義しておけば、MathJax の拡張にない記号も数式プレビューに表示させることが出来るだろう。

それぞれの記号の符号位置は Wikipedia などを参照すれば良いだろう。あるいは、以下の compart\.com の Sm カテゴリを参照すると良い。

https://www.compart.com/en/unicode/category/Sm

<details>
<summary>unicode 拡張を利用して天文記号を定義する（折りたたみ）</summary>
<div>

wasysym パッケージで定義されている惑星記号など。（間違ってはいないはず。）

実際に利用すると文字が少し左右に詰まる印象があるため、`\unicode` の左右に `\;` や `\hspace` を挿入しておいても良いだろう。また、少し小さい印象がある場合は、`\large` を含めても良いと思われる。

```latex
% hover.tex
%%
%% Astronomical symbol
% \newcommand{\earth}{\unicode{x1F728}}
\newcommand{\earth}{\unicode{x2641}}
\newcommand{\astrosun}{\unicode{x2609}}
\newcommand{\venerable}{\unicode{x2648}}
\newcommand{\ascnode}{\unicode{x260A}}
\newcommand{\descnode}{\unicode{x260B}}
\newcommand{\fullmoon}{\unicode{x2B58}}
\newcommand{\newmoon}{\unicode{x2B24}}
\newcommand{\leftmoon}{\unicode{x263E}}
\newcommand{\rightmoon}{\unicode{x263D}}
%%
%% Planet symbol
\newcommand{\mercury}{\unicode{x263F}}
\newcommand{\venus}{\unicode{x2640}}
\newcommand{\mars}{\unicode{x2642}}
\newcommand{\jupiter}{\unicode{x2643}}
\newcommand{\saturn}{\unicode{x2644}}
\newcommand{\uranus}{\unicode{x26E2}}
\newcommand{\neptune}{\unicode{x2646}}
\newcommand{\pluto}{\unicode{x2647}}
%%
%% Astrological symbol and the zodiacal symbol
\newcommand{\aries}{\unicode{x2648}}
\newcommand{\taurus}{\unicode{x2649}}
\newcommand{\gemini}{\unicode{x264A}}
\newcommand{\cancer}{\unicode{x264B}}
\newcommand{\leo}{\unicode{x264C}}
\newcommand{\virgo}{\unicode{x264D}}
\newcommand{\libra}{\unicode{x264E}}
\newcommand{\scorpius}{\unicode{x264F}}
\newcommand{\sagittarius}{\unicode{x2650}}
\newcommand{\capricorn}{\unicode{x2651}}
\newcommand{\aquarius}{\unicode{x2652}}
\newcommand{\pisces}{\unicode{x2653}}
```

</div></details>

<details>
<summary> 除算記号とベクトル解析における発散（折りたたみ）</summary>
<div>

ベクトル解析における発散を表す “div” を `\div` として定義したい場合、除算記号 “÷” と発散を表す “div” を共存させたい。MathJax では “÷” は `\div` と定義されているため、このようにしたい場合にはコマンドが競合してしまう。これを解消する。

どうやら、MathJax における `\DeclareMathOperator` は上書きするような挙動を示すため、LaTeX のように `\div` を `\let` で先に別コマンドへ逃がす必要がない。また、“÷” は unicode 拡張から符号位置 (`x00F7`) を指定すれば良い。コマンド名は `\divisionsymbol` とした。

したがって、次のようにする。

```latex
% hover.tex
\DeclareMathOperator{\div}{div}
\newcommand{\divisionsymbol}{\unicode{x00F7}}
```

もちろん、発散をナブラ記号で表現したい場合には、次のようにする。

```latex
% hover.tex
\newcommand{\div}{\nabla\cdot}
\newcommand{\divisionsymbol}{\unicode{x00F7}}
```

ちなみに、LaTeX と同じように次のような定義をしても上手くいかない。

```latex
% 上手くいかない hover.tex
\let\divisionsymbol\div
\DeclareMathOperator{\div}{div}
```

また、physics 拡張では `\divisionsymbol` を提供していない。どうやら、`\div` を上書きしているだけらしい。

</div>
</details>

# 参照

- LaTeX Workshop
  - [Hover \# `latex-workshop.hover.preview.mathjax.extensions` \- James-Yu/LaTeX-Workshop Wiki](https://github.com/James-Yu/LaTeX-Workshop/wiki/Hover#latex-workshophoverpreviewmathjaxextensions)
- MathJax
  - [The TeX/LaTeX Extension List \- MathJax 3.2 documentation](https://docs.mathjax.org/en/latest/input/tex/extensions/index.html)

## MathJax とは

> [MathJax Documentation \- MathJax 3.2 documentation](https://docs.mathjax.org/en/latest/index.html)
> > MathJax is an open-source JavaScript display engine for LaTeX, MathML, and AsciiMath notation that works in all modern browsers, with built-in support for assistive technology like screen readers.
>
> *Repository:* [mathjax/MathJax: Beautiful and accessible math in all browsers](https://github.com/mathjax/MathJax)

LaTeX、MathML、AsciiMath による記法を用いてブラウザ上で数式を表示できる JavaScript のこと。Qiita で数式が書けるのはこの JavaScript のおかげ。よく類似の KaTeX と比較される。

MathJax は LaTeX の記法で数式を表示することが出来るものの、その細部が LaTeX そのものではないので注意が必要。
特に、コマンドの定義には `\def`、`\let`、`\newcommand`、`\renewcommand` をサポートしているが、どれも上書き定義しているだけのような挙動をしているように感じる。

たとえば、次のようなことをすると LaTeX ではエラーを返すが、MathJax では “re:test” を返す。不思議。

```latex
% LaTeX ではエラーになる
\newcommand{\test}{test}     % ← MathJax では無視される
\newcommand{\test}{re:test}  % ← MathJax ではこちらが出力される
```

`\let` の挙動は LaTeX のそれとは異なるため注意が必要かもしれない。

## 関連記事

LaTeX Workshop に関する記事は以下の 5 つがあります。本記事と合わせてご覧ください。

1. **[LaTeX Workshop を使いこなす \- Qiita](https://qiita.com/Yarakashi_Kikohshi/items/a9357dd469320ffb65a0)**

    > LaTeX Workshop を使って TeX ファイルをタイプセットして PDF を作成するまでを紹介します。

2. **[LaTeX Workshop をもう少し使いこなす \- Qiita](https://qiita.com/Yarakashi_Kikohshi/items/1a275f2046b002e398b3)**

    > LaTeX Workshop で利用できるスニペットやコマンドを紹介します。また、他のカスタマイズを考えます。

3. **[LaTeX Workshop をもっと使いこなす \- Qiita](https://qiita.com/Yarakashi_Kikohshi/items/1f2225c7e28aad498998)**

    > LaTeX Workshop の便利な特徴を紹介します。ホバーによる数式や相互参照の確認、インテリセンスによる補完機能などがあります。

4. **[Zotero と LaTeX Workshop で bib ファイルを扱いこなす \- Qiita](https://qiita.com/Yarakashi_Kikohshi/items/8f720643543ba175f7cc)**

    > Zotero から bib ファイルを出力して LaTeX Workshop でフォーマットするする方法を紹介します。

5. **[LaTeX Workshop の数式プレビューを使いこなす - Qiita](https://qiita.com/Yarakashi_Kikohshi/items/4570bba51787e47a03c6)** ← 本記事 :1234:

    > 数式プレビューをもっと使えるようにカスタマイズします。

# 余談

いつの間にか `\boldsymbol` がプレビューパネルで使えないなと思っていたら、むしろさまざまな機能が使えるようになっていた。

xparse パッケージで定義したコマンドを理解できない、diffcoeff パッケージをプレビュー出来ないなど MathJax でサポートされていないパッケージは多数ある。
追々にはプレビューを使わなくとも数式を打てるようになっていきたいところ。

# 追記

- 2022/04/11 : いくつかの例を追加。
- 2022/08/12: 軽微修正。
- 2022/11/02: 軽微修正。