はじめに
Qiita に限らず、記事を作成するときには、文章と挿図のどちらにも、見た目が同じ数式を使用することが大切です。理系の文書では、本来は同一の文字でも、使っているフォントが異なれば別の意味にとられることもあります。これでは、せっかく書いた記事なのに思い通りに理解してもらえなくなります。
ところが、最近、\boldsymbol
フォント($\boldsymbol{ABCuvw}$)を使って記事のほとんどを書き終え、やっと挿図を仕上げるという段階になって、MATLAB の figure ではそのフォントが使えないことに気づくという失敗がありました。そして結局は、MATLAB で使える\mathbf
フォント($\mathbf{ABCuvw}$)に合わせて記事を書き直すことになりました。
そこで、今後の失敗を避けるため、MATLAB での数式の制約について最低限の理解をしておきたいと思い、無理のない範囲でざっと確認してみることにしました(確認環境: MATLAB R2019a)。
なお、実際には使えるフォントや数式なのに、私の呼び出し方法が適切ではないとか、新バージョンの MATLAB では既に改善されているようなこともあるかもしれません。お気づきの点があれば、コメントを宜しくお願いします。
数式のレンダリング結果
まずは、MathJax早見ページ(MathJax Ver.2)から適当にピックアップしてきたフォントや数式について、次の3種類のツールによるレンダリング結果を表1~3に示しています。それぞれの表で、同一位置のセルは同一の数式になるように配置してあります。各セルの数式の記法については、最後に添付している MATLAB 用のプログラムを参照ください(囲み文字などの違いにより、それぞれの記法には若干の差があります。囲み文字:$$...MATLAB、$...Qiita,Chrome、さらに、Qiita ではエスケープ文字 \
の特殊な扱いが必要)。
- MATLAB(LaTeX)
- Qiita マークダウン(MathJax Ver.3)
- Google Chrome の拡張機能の Markdown Viewer(MathJax Ver.3)
表1. MATLAB で使用可能な数式
表2. Qiita で使用可能な数式
$ABCuvw$ | $\mathit{ABCuvw}$ | $\mathrm{ABCuvw}$ | $\mathbf{ABCuvw}$ | $\mathsf{ABCuvw}$ |
$\mathtt{ABCuvw}$ | $\boldsymbol{ABCuvw}$ | $\mathcal{ABCuvw}$ | $\mathfrak{ABCuvw}$ | $\mathscr{ABCuvw}$ |
$\mathbb{ABCuvw}$ | $\pmb{ABCuvw}$ | $\alpha\beta\gamma\delta\epsilon\zeta$ | $\eta\theta\iota\kappa\lambda\mu$ | $\nu\xi o\pi\rho\sigma$ |
$\tau\upsilon\phi\chi\psi\omega$ | $\varepsilon\vartheta\varkappa\varpi\varrho\varsigma\varphi$ | $\Gamma\Delta\Theta\Lambda$ | $\Xi\Pi\Sigma\Upsilon$ | $\Phi\Psi\Omega$ |
$\varGamma\varDelta\varTheta\varLambda$ | $\varXi\varPi\varSigma\varUpsilon$ | $\varPhi\varPsi\varOmega$ | $\mathbf{P}_{c}\ \mathbf{P}_{\!c}\ \mathbf{P}_{\!\!c}$ | ${}_{6}^{12}\mathrm{C}\ \,{}_{\,\,6}^{12}\mathrm{C}$ |
${}_{\ 6}^{12}\mathrm{C}\ \,{\mathstrut}_{\ 6}^{12}\mathrm{C}$ | $\sqrt{g}\sqrt{h}\sqrt[n]{x}$ | $\sqrt{\mathstrut g}\sqrt{\mathstrut h}\sqrt[n]{\mathstrut x}$ | $\overline{A}\ \underline{A}\ \overrightarrow{AB}$ | $\,\hat{A}\ \hat{\hat{A}}\ \skew5\hat{\hat{A}}\,$ |
$\dot{x}\ \ddot{x}\ x^{\prime}\ x^{\prime\prime}$ | $\nabla\,\nabla^2\Delta$ | $\Longleftrightarrow\,\angle\,\infty$ | $\longrightarrow\,\odot\,\otimes$ | $\in\notin\subset\not\subset$ |
$a+b+c$ | $a{+}b{+}c$ | $\mathcal{F}[f(t)]$ | $\mathcal{L}[f(t)]$ | $\Re\ \Im\ \hbar$ |
$\textstyle\frac{Y}{X}\ \ (\frac{Y}{X})$ | $\textstyle\left(\frac{Y}{X}\right)\left\{\frac{Y}{X}\right\}$ | $\textstyle\sum_{n=1}^{10}n^2$ | $\textstyle\prod_{i=1}^{10}x_i$ | $\textstyle\int_{0}^{\infty}\!\!f(x)dx$ |
$\textstyle\oint_c \mathbf{B}(\mathbf{r})d\mathbf{r}$ | $\textstyle\frac{\partial^2\! f}{\partial x^2}\ \ \frac{\!d^2\!f}{\,dt^2}$ | $\textstyle\frac{A+B}{C+\frac{D}{E+\frac{F}{G}}}$ | $\textstyle\mathop{ABC}_{n=1}^{n=10}$ | $\textstyle\sqrt{\frac{y}{x}}$ |
$\hspace{4em}$ | $\hspace{4em}$ | $\hspace{4em}$ | $\hspace{4em}$ | $\hspace{4em}$ |
$\displaystyle\frac{Y}{X}\ \ (\frac{Y}{X})$ | $\displaystyle\left(\frac{Y}{X}\right)\left\{\frac{Y}{X}\right\}$ | $\displaystyle\sum_{n=1}^{10}n^2$ | $\displaystyle\prod_{i=1}^{10}x_i$ | $\displaystyle\int_{0}^{\infty}\!\!f(x)dx$ |
$\displaystyle\oint_c \mathbf{B}(\mathbf{r})d\mathbf{r}$ | $\displaystyle\frac{\partial^2\! f}{\partial x^2}\ \ \frac{\!d^2\!f}{\,dt^2}$ | $\displaystyle\frac{A+B}{C+\frac{D}{E+\frac{F}{G}}}$ | $\displaystyle\mathop{ABC}_{n=1}^{n=10}$ | $\displaystyle\sqrt{\frac{y}{x}}$ |
$\hspace{6em}$ | $\hspace{6em}$ | $\hspace{6em}$ | $\hspace{6em}$ | $\hspace{6em}$ |
表3. Markdown Viewer で使用可能な数式
MATLAB の数式の特徴
MATLAB の数式の表には空欄が目立ちます。「はじめに」に書いた \boldsymbol
(太字斜体)をはじめとして\mathfrak
(ドイツ文字)、\mathscr
(花文字)、\mathbb
(白抜き文字)、\pmb
(疑似太字化)や、ギリシャ文字の大文字斜体がすべて使えません。ギリシャ文字の小文字もなぜか \varkappa
だけは使えません。
表1の5行4列目以降の欄は、他の表と同様に隙間なく埋まっていますが、上記の空欄以外の数式であれば問題なく表示できるという意味ではありません。MATLAB で表示できない数式をテスト対象から外しているだけです。
例えば、フォントのサイズや色の指定コマンドは使えません。MATLAB の text コマンドのプロパティの指定で逃げることはできますが、一つの式の中の一部の文字だけのサイズや色を変更したいときには対応が困難です。
また、行列や場合分けなど複数行にわたるような数式も書けません。さらに、多くの種類の記号についても対応できていません。しかし、自分がいつも頻繁に使っている程度の記号であれば非対応のものはあまりなさそうです。
Qiita の数式との相性
私が、数式の相性という点で最も気になるのは、各表の1行1列目にある $ABCuvw$ の中の $v$ の文字です。使用ツールによっては、この文字が $\nu$ と見分けが付きにくい字体になっていることがあります(今では、以前よりは大分マシになっているようですが、Microsoft Word など)。この文字は、電圧や速度など多くの物理量を表すときに頻繁に使用されるので、フォントが揃っていないと気分が良くありません。
この点では、MATLAB と Qiita では $v$ の表示に殆ど差はなく、相性は良いといえます。現在の最大の難点は、MATLAB で \boldsymbol
が使えないことでしょう。
Qiita の数式には、ベースラインが揃わなかったり、\dot
の位置が高すぎたり、変則的なエスケープが必要だったりという不満が沢山ありますが、近いうちの改善を期待して、ここではこれ以上は触れません。
おわりに
MATLAB でも、早く \boldsymbol
が使えるようになって欲しいものです。
なお、今回は MATLAB 本体の figure に絞った話だったので、上では触れませんでしたが、Simulink の「v」の字は私が嫌いな「$\nu$」 字風の書体です。なぜ、MATLAB と Simulink で書体が異なるのでしょうか?
プログラム
% LaTeX_formula01.m
% MATLAB で使える数式の確認
clear
close all
% ==========================
% テスト用の数式
formula={
'$$ABCuvw$$'
'$$\mathit{ABCuvw}$$'
'$$\mathrm{ABCuvw}$$'
'$$\mathbf{ABCuvw}$$'
'$$\mathsf{ABCuvw}$$' % \mathsf{ABCuvw} → 表示はされるが、警告あり
% フォント cmss10 はサポートされていません。
'$$\mathtt{ABCuvw}$$'
'$$$$' % \boldsymbol{ABCuvw} → エラー表示
% \bm{ABCuvw}でもダメ
'$$\mathcal{ABCuvw}$$'
'$$$$' % \mathfrak{ABCuvw} → エラー表示
% {\frak ABCuvw}でもダメ
'$$$$' % \mathscr{ABCuvw} → エラー表示
% {\scr ABCuvw}でもダメ
'$$$$' % \mathbb{ABCuvw} → エラー表示
% {\Bbb ABCuvw}でもダメ
'$$$$' % \pmb{ABCuvw} → エラー表示
'$$\alpha\beta\gamma\delta\epsilon\zeta$$'
'$$\eta\theta\iota\kappa\lambda\mu$$'
'$$\nu\xi o\pi\rho\sigma$$'
'$$\tau\upsilon\phi\chi\psi\omega$$'
'$$\varepsilon\vartheta\ \varpi\varrho\varsigma\varphi$$'
% \varkappa のみ → エラー表示
'$$\Gamma\Delta\Theta\Lambda$$'
'$$\Xi\Pi\Sigma\Upsilon$$'
'$$\Phi\Psi\Omega$$'
'$$$$' % ギリシャ大文字の斜体
'$$$$' % すべて → エラー表示
'$$$$' % すべて → エラー表示
'$$\mathbf{P}_{c}\ \mathbf{P}_{\!c}\ \mathbf{P}_{\!\!c}$$'
'$${}_{6}^{12}\mathrm{C}\ \,{}_{\,\,6}^{12}\mathrm{C}$$'
'$${}_{\ 6}^{12}\mathrm{C}\ \,{\mathstrut}_{\ 6}^{12}\mathrm{C}$$'
'$$\sqrt{g}\sqrt{h}\sqrt[n]{x}$$'
'$$\sqrt{\mathstrut g}\sqrt{\mathstrut h}\sqrt[n]{\mathstrut x}$$'
'$$\overline{A}\ \underline{A}\ \overrightarrow{AB}$$'
'$$\hat{A}\ \hat{\hat{A}}\ \skew5\hat{\hat{A}}$$'
'$$\dot{x}\ \ddot{x}\ x^{\prime}\ x^{\prime\prime}$$'
'$$\nabla\,\nabla^2\Delta$$'
'$$\Longleftrightarrow\,\angle\,\infty$$'
'$$\longrightarrow\,\odot\,\otimes$$'
'$$\in\notin\subset\not\subset$$'
'$$a+b+c$$'
'$$a{+}b{+}c$$'
'$$\mathcal{F}[f(t)]$$'
'$$\mathcal{L}[f(t)]$$'
'$$\Re\ \Im\ \hbar$$'
'$$\textstyle\frac{Y}{X}\ \ (\frac{Y}{X})$$'
'$$\textstyle\left(\frac{Y}{X}\right)\left\{\frac{Y}{X}\right\}$$'
'$$\textstyle\sum_{n=1}^{10}n^2$$'
'$$\textstyle\prod_{i=1}^{10}x_i$$'
'$$\textstyle\int_{0}^{\infty}\!\!f(x)dx$$'
'$$\textstyle\oint_c \mathbf{B}(\mathbf{r})d\mathbf{r}$$'
'$$\textstyle\frac{\partial^2\! f}{\partial x^2}\ \ \frac{\!d^2\!f}{\,dt^2}$$'
'$$\textstyle\frac{A+B}{C+\frac{D}{E+\frac{F}{G}}}$$'
'$$\textstyle\mathop{ABC}_{n=1}^{n=10}$$'
'$$\textstyle\sqrt{\frac{y}{x}}$$'
'$$\displaystyle\frac{Y}{X}\ \ (\frac{Y}{X})$$'
'$$\displaystyle\left(\frac{Y}{X}\right)\left\{\frac{Y}{X}\right\}$$'
'$$\displaystyle\sum_{n=1}^{10}n^2$$'
'$$\displaystyle\prod_{i=1}^{10}x_i$$'
'$$\displaystyle\int_{0}^{\infty}\!\!f(x)dx$$'
'$$\displaystyle\oint_c \mathbf{B}(\mathbf{r})d\mathbf{r}$$'
'$$\displaystyle\frac{\partial^2\! f}{\partial x^2}\ \ \frac{\!d^2\!f}{\,dt^2}$$'
'$$\displaystyle\frac{A+B}{C+\frac{D}{E+\frac{F}{G}}}$$'
'$$\displaystyle\mathop{ABC}_{n=1}^{n=10}$$'
'$$\displaystyle\sqrt{\frac{y}{x}}$$'
};
% ==========================
% textstyle の数式
figure(1)
LL=10; % axes の行数
CC=5; % axes の列数
Pf=get(gcf,'Position');
set(gcf,'Position',[0 0 Pf(3) Pf(4)*1.2]);
subplot(LL,CC,1)
Pf=get(gcf,'Position');
Pa=get(gca,'Position');
Kasp=Pf(3)*Pa(3)/(Pf(4)*Pa(4));
Ax=[-Kasp Kasp -1 1];
for n=1:LL*CC
subplot(LL,CC,n)
axis equal;
axis(Ax);
camva(3.5);
xticklabels(''); yticklabels('');
text(0,0,formula{n},'FontSize',13,'Interpreter','latex', ...
'HorizontalAlign','center','VerticalAlign','middle');
end
% ==========================
% displaystyle の数式
figure(2)
LL=10;
CC=5;
Pf=get(gcf,'Position');
set(gcf,'Position',[0 0 Pf(3) Pf(4)*1.2]*1.29);
subplot(LL,CC,1)
Pf=get(gcf,'Position');
Pa=get(gca,'Position');
Kasp=Pf(3)*Pa(3)/(Pf(4)*Pa(4));
Ax=[-Kasp Kasp -1 1];
for n=1:10
subplot(LL,CC,n)
axis equal;
axis(Ax);
camva(3.5);
xticklabels(''); yticklabels('');
text(0,0,formula{n+50},'FontSize',13,'Interpreter','latex', ...
'HorizontalAlign','center','VerticalAlign','middle');
end
% ==========================
% デスクトップのマスキング用
figure(3)