1. はじめに
MATLAB の figure の中では $\rm\LaTeX$ 文字が使えます。しかし、その表現の自由度はかなり制限されています。これについては、すでに下記の Qiita 記事に詳細を投稿済です。
【MATLAB の figure で使用可能な数式の確認】と【Qiita の数式との相性】
特に、斜体の太字コマンド「\boldsymbol」( $\boldsymbol{ABCabc}$ )が使えないのは非常に不便です。ベクトルを表すシンボルが $ABCabc$ だけでは、どうにも軽すぎて引き締まりません。さらに困ったことに、最後の切り札であるはずの簡易太字化コマンド「\pmb」( $\pmb{ABCabc}$ )さえも使えません。そこで、その解決策を考えてみることにしました。
利用環境: MATLAB R2019a
2. 太字化の結果
前記の「\pmb」コマンドでは、位置を僅かに左右に移動して2重印字することで、太文字のように見せています(拡大してみれば分かります)。したがって、「\pmb」コマンドには非対応でも、MATLAB の text コマンドを使って、位置をずらせながら2回印字すれば代用できるはずです。しかし、1行で済むはずのプログラムを2行も書くことになるので気が進みません。
しかし、これは私の誤解でした。どのような多重印字でも1行だけで書けるようです。長年 MATLAB を使ってきましたが、text コマンドの位置指定で、このような使い方ができることに今まで気づきませんでした。
そんなわけで、この方法で太字化した結果を図1に示しています。上半分が3重印字によるもの、下半分は7重印字によるものです。1行で書けることが分かったため、多重数はかなり奮発してみました。
拡大してみると、「\pmb」コマンドの2重印字ほどではありませんが、3重印字では、「文字の重なりのズレ」や「$\oplus$ の線の太さの不均一さ」が少々気になります。しかし、7重印字では殆ど目立ちません。Qiita の太字と完全一致ではないにしても、遜色はありません。手荒な扱いを受けて、MATLAB は悲鳴を上げているかもしれませんが、7重印字がお勧めです。
比較のための Qiita の MathJax 文字
(1,3行目: default、2,4行目: boldsymbol)
$$
\begin{align}
&ABCDEFGHIJKLMNOPQRSTUVWXYZ\\
&\boldsymbol{ABCDEFGHIJKLMNOPQRSTUVWXYZ}\hspace{20em}\\
&abcdefghijklmnopqrstuvwxyz\\
&\boldsymbol{abcdefghijklmnopqrstuvwxyz}
\end{align}
$$
図1 疑似太字化の結果
(上半: 3重印字、下半: 7重印字)
しかし、図の右下にあるような「太文字と細文字が混じり合った式」を書くのは大変です。式の複雑さにもよりますが、プログラムの行数が増えるうえに、試行錯誤での太文字の位置合わせが大変です。やはり、「\boldsymbol」コマンドの登場が待たれるところです。
3. プログラム
実は、1行で書けるというのは誇大表現です。次のような事前準備は必要です。
% 3重印字のとき
dd=0.3; % 印字位置の微小ズレ単位
Xd=[0 dd dd]; % x方向の印字位置分布
Yd=[0 dd -dd]; % y方向 〃
% 7重印字のとき
dd=0.15; % 印字位置の微小ズレ単位
th=linspace(0,360,7);
th(end)=[];
Xd=[0 dd*cosd(th)]; % x方向の印字位置分布
Yd=[0 dd*sind(th)]; % y方向 〃
この後は、単一行の text コマンドの中の印字位置を、Xd,Yd を利用して次のように指定するだけで目的は達せられます。( (X0,Y0)は本来の印字希望位置 )
text(X0+Xd,Y0+Yd,'$$ABCabc$$', .... ,'Interpreter','latex');
最後に、図1を描いたプログラムの全体も添付しておきます。
% font_weight01.m
% LaTeX文字の太字化(boldsymbol風の書体)
clear;
close all;
hf=figure(1);
set(hf,'InvertHardcopy','off');
plot([-100 100],[0 0]);
hold on;
axis equal;
moji1='ABCDEFGHIJKLMNOPQRSTUVWXYZ';
moji2='abcdefghijklmnopqrstuvwxyz';
% === 3重印字のアルファベット ===
dd=0.3; % 印字位置の微小ズレ単位
Xd=[0 dd dd]; % x方向の印字位置分布
Yd=[0 dd -dd]; % y方向 〃
text(0,60,['$$' moji1 '$$'],'FontSize',15,'HorizontalAlign', ...
'center','VerticalAlign','middle','Interpreter','latex');
text(0+Xd,45+Yd,['$$' moji1 '$$'],'FontSize',15,'HorizontalAlign', ...
'center','VerticalAlign','middle','Interpreter','latex');
text(-96,30,['$$' moji2 '$$'],'FontSize',15,'HorizontalAlign', ...
'left','VerticalAlign','middle','Interpreter','latex');
text(-96+Xd,15+Yd,['$$' moji2 '$$'],'FontSize',15, ...
'HorizontalAlign','left','VerticalAlign','middle', ...
'Interpreter','latex');
text(40,30,'$$\oplus$$','FontSize',20,'HorizontalAlign','center', ...
'VerticalAlign','middle','Interpreter','latex');
text(40+Xd,15+Yd,'$$\oplus$$','FontSize',20,'HorizontalAlign', ...
'center','VerticalAlign','middle','Interpreter','latex');
% === 7重印字のアルファベット ===
dd=0.15; % 印字位置の微小ズレ単位
th=linspace(0,360,7);
th(end)=[];
Xd=[0 dd*cosd(th)]; % x方向の印字位置分布
Yd=[0 dd*sind(th)]; % y方向 〃
text(0,-15,['$$' moji1 '$$'],'FontSize',15,'HorizontalAlign', ...
'center','VerticalAlign','middle','Interpreter','latex');
text(0+Xd,-30+Yd,['$$' moji1 '$$'],'FontSize',15, ...
'HorizontalAlign','center','VerticalAlign','middle', ...
'Interpreter','latex');
text(-96,-45,['$$' moji2 '$$'],'FontSize',15,'HorizontalAlign', ...
'left','VerticalAlign','middle','Interpreter','latex');
text(-96+Xd,-60+Yd,['$$' moji2 '$$'],'FontSize',15, ...
'HorizontalAlign','left','VerticalAlign','middle', ...
'Interpreter','latex');
text(40,-45,'$$\oplus$$','FontSize',20,'HorizontalAlign','center', ...
'VerticalAlign','middle','Interpreter','latex');
text(40+Xd,-60+Yd,'$$\oplus$$','FontSize',20,'HorizontalAlign', ...
'center','VerticalAlign','middle','Interpreter','latex');
% === 7重印字(太文字/細文字 混合の数式) ===
text(96,-55, ...
'$$\phantom{F}{=}m\frac{{\rm d}\phantom{v}}{{\rm d}\,t}$$', ...
'FontSize',15,'HorizontalAlign','right','VerticalAlign', ...
'middle','Interpreter','latex');
text(65+Xd,-56+Yd,'$$F$$','FontSize',15,'HorizontalAlign', ...
'center','VerticalAlign','middle','Interpreter','latex');
text(93+Xd,-50+Yd,'$$v$$','FontSize',15,'HorizontalAlign', ...
'center','VerticalAlign','middle','Interpreter','latex');
% === 図のファイル化 ===
basename=mfilename('fullpath');
print(gcf,'-dpng',[basename '.png'],'-r300');
4. おわりに
添付したプログラムは、axis の幅が 200 で、x, y 軸が同スケールの状態(axis equal)での一例です。axis の幅や文字サイズに応じて、変数 dd(印字位置の微小ズレ単位)は適切な値に設定しなおす必要があります。また、x, y 軸のスケールが異なるときには相応の修正が必要です。