5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-01-14

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

LaTeX Workshop | James Yu
投稿時: ver.8.23.0 (2021/1 現在)、最終更新時: ver.8.29.0

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

mathHoverPreview

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

■ 使い方

# Previewing equations - Hover - James-Yu/LaTeX-Workshop Wiki

数式プレビューにはホバーとプレビューパネルの 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

■ 拡張カスタマイズ

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

# latex-workshop.hover.preview.mathjax.extensions - Hover - James-Yu/LaTeX-Workshop Wiki

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

The TeX/LaTeX Extension List - MathJax 3.2 documentation

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

拡張 説明
ams LaTeX の AMSmath パッケージと amsfonts
color LaTeX の color パッケージ
newcommand \newcommand\newenvironment などを利用可能にする
noerrors TeX のエラーを表示せずにコードをそのまま表示
noundefined 未定義のコマンドをコマンド名のまま表示

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

拡張 説明
amscd AMSmath による CD 環境
boldsymbol AMSmath による \boldsymbol
braket LaTeX の braket パッケージ
bussproofs LaTeX の bussproofs パッケージ
cancel LaTeX の cancel パッケージ
cases LaTeX の cases パッケージ
centernot LaTeX の centernot パッケージ
colortbl LaTeX の colortbl パッケージ
empheq LaTeX の empheq パッケージ
gensymb LaTeX の gensymb パッケージ
mathtools LaTeX の mathtools パッケージ
mhchem LaTeX の mhchem パッケージ
physics LaTeX の physics パッケージ
textcomp LaTeX の textcomp パッケージ
textmacros \text コマンド内のテキストモードの文字装飾を処理
upgreek LaTeX の upgreek パッケージ
verb \verb を利用可能に

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

拡張 説明
bbox 数式の背景や枠線の追加
enclose ボックスや楕円、取り消し線などのマーカー
MathML より
extpfeil 矢印の生成
html HTML のリンク機能
unicode Unicode による文字の指定

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

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

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

ちなみに、MathJax の拡張機能のリスト と比較すると次のような拡張は利用できないらしい。数式プレビューをしたい場合には特に必要はないと思われる。

利用できない拡張
actionautoloadcolorv2configmacrosrequiresetoptionstagformat

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

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

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

bm-error

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

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

  "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

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

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

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

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

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

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

    \let handled incorrectly - Issue #2404 - mathjax/MathJax

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

▽ 具体例

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

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

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

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

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

bm-success

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

その他の例:

newpxmath などの \coloneq に対応する(折りたたみ)

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

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

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

upgreek 拡張を利用して newpxmath などの立体ギリシャ文字に対応する(折りたたみ)

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

% 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}
slashed パッケージの対応(折りたたみ)

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

% hover.tex
\newcommand{\slashed}[1]{\centernot{#1}}
siunitx パッケージによる単位の対応(折りたたみ)

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

Command by gensymb Symbol sample
\degree °
\celsius
\perthousand
\ohm Ω
\micro µ

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

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

esvect パッケージによる矢印ベクトルの対応(折りたたみ)

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

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

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

▽ 装飾や新しい記号

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

特定のコマンドを装飾・強調する(折りたたみ)

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

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

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

colored bm

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

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

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

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

unicode 拡張を利用して天文記号を定義する(折りたたみ)

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

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

% 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” を \div として定義したい場合、除算記号 “÷” と発散を表す “div” を共存させたい。MathJax では “÷” は \div と定義されているため、このようにしたい場合にはコマンドが競合してしまう。これを解消する。

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

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

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

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

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

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

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

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

参照

MathJax とは

MathJax Documentation - MathJax 3.2 documentation

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

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

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

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

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

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

関連記事

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

  1. LaTeX Workshop を使いこなす - Qiita

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

  2. LaTeX Workshop をもう少し使いこなす - Qiita

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

  3. LaTeX Workshop をもっと使いこなす - Qiita

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

  4. Zotero と LaTeX Workshop で bib ファイルを扱いこなす - Qiita

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

  5. LaTeX Workshop の数式プレビューを使いこなす - Qiita ← 本記事 :1234:

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

余談

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

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

追記

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?