🤖

LuaLaTeXとunicode-mathとboldsymbolの組み合わせの話

2023/07/15に公開

TL;DR

  • unicode-mathとLuaLaTeXと\boldsymbolを組み合わせると、PDFで太字にならない
  • PandocからLuaLaTeXを使ってPDFを生成する時に\boldsymbolが効かないのはこれが原因
  • LuaLaTeXと\boldsymbolの組み合わせなら大丈夫
  • 簡単な対応策は、太字だが斜体にならない\mathbfを使うこと
  • どうしても太字かつ斜体にしたければ、プリアンブルに以下を追加。
\setmainfont{XITS}
\setmathfont{XITS Math}
\setmathfont[version=bold,FakeBold=3.5]{XITS Math}

(2023年7月15日追記)

奥村さんからsymbfitを使うと良い、と教えていただきました。確かにLuaLaTeX+unicode-mathの組み合わせでも\symbfitなら太字かつ斜体になります。VSCodeのプレビューは対応していませんが、GitHubのプレビューは対応しているようです。

現象

Markdown+Pandoc+LuaLatex

僕はMarkdownでノートを書き、PandocでPDF化しているのだが、数式を含むため、PDF化にLuaLaTeXを使っている。この時、\boldsymbolが太字にならないことに困っていた。

例えば、

# test

$$
\boldsymbol{r}=r
$$

みたいなMarkdownを書いて、

pandoc test.md -o test.pdf --pdf-engine=lualatex -V documentclass=ltjarticle

で変換すると、

ng1

のように、太字にならない。

特にエラーも警告も出ず、ただ出力されるPDFで\boldsymbolが無視されるらしい。地道な二分探索の結果、以下のようなことがわかった。

LuaLaTeX+boldsymbol

まず、LuaLaTeX+boldsymbolの組み合わせは問題ない。こんなTeXファイルを書いて

\documentclass{ltjarticle}
\usepackage{amsmath}
\begin{document}
$$
  \boldsymbol{r} = r
$$
\end{document}
lualatex test

としてPDFを作ると、ちゃんと太字になる。

ok1

LuaLaTeX+unicode-math+boldsymbol

しかし、unicode-mathパッケージを使うと、太字にならない。

\documentclass{ltjarticle}
\usepackage{amsmath}
\usepackage{unicode-math} %% ←これを追加
\begin{document}
$$
  \boldsymbol{r} = r
$$
\end{document}
lualatex test

ng2

対応策

Pandocから数式を含むMarkdownをLuaLaTeXでPDF化した時、\boldsymbolが使えなかったのはLuaLaTeXとunicode-mathの組み合わせの問題。Pandocからunicode-mathを出力しないようにする方法も探したのだが、そもそも\boldsymbolが非推奨っぽい。とりあえず対応策を2つ見つけた。

mathbfを使う

よくわかっていないが、ベクトルを表す時に「太字かつ斜体」を使うのは日本独自っぽい(?)らしく、単に太字にしたければ\mathbfを使えば良いそうだ。

# test

$$
\mathbf{r}=r
$$
pandoc test.md -o test.pdf --pdf-engine=lualatex -V documentclass=ltjarticle

以下のような出力となる。

ok2

Poorman's boldsymbolを使う

ここにあった解決策。プリアンブルに以下を記述する。

\setmainfont{XITS}
\setmathfont{XITS Math}
\setmathfont[version=bold,FakeBold=3.5]{XITS Math}

例えば、全体のTeXファイルはこうなる。

\documentclass{ltjarticle}
\usepackage{amsmath}
\usepackage{unicode-math} %% ←これがあると太字にならない
%% ↓以下を追加
\setmainfont{XITS}
\setmathfont{XITS Math}
\setmathfont[version=bold,FakeBold=3.5]{XITS Math}

\begin{document}
$$
    \boldsymbol{r} = r
$$
\end{document}

出力はこんな感じ。

ok3

やや癖のあるフォントだが、一応できる。

Poorman's boldsymbolをPandocから利用する

上記の解決策をPandocから利用するには、TeXのテンプレートを使う。

\setmainfont{XITS}
\setmathfont{XITS Math}
\setmathfont[version=bold,FakeBold=3.5]{XITS Math}

という内容のtemplate.texを用意しておき、

# test

$$
\boldsymbol{r}=r
$$

という内容のtest.mdがあるディレクトリで、

pandoc test.md -o test.pdf --pdf-engine=lualatex -V documentclass=ltjarticle -H ./template.tex

としてPDFに変換すると、以下のような出力となる。

ok3

(2023年7月15日追記)symbfitを利用する

\symbfitを利用すれば、LuaLaTeXとunicode-mathの組み合わせでも太字かつ斜体になる。

# test

$$
\symbfit{r}=r
$$
pandoc test.md -o test.pdf --pdf-engine=lualatex -V documentclass=ltjarticle

出力はこんな感じ。

ok5

まとめ

LaTeXでベクトルを表す時、太字+斜体にすると問題が多いので、単なる太字の\mathbfを使うか、素直に\vecを使うのが良さそう。

タイトルに「LuaLaTeXの……」と書いたが、他のLaTeXエンジンではどうなるのかまでは調べていない。

GitHubで編集を提案

Discussion