本稿は TeX & LaTeX Advent Calendar 2019 の2日目の記事です.
1日目は @kakinaguru_zo さんによる「LuaTeXでカラーフォント・絵文字✌(SVG/COLR/CBDT)」でした.
3日目はp_typoさんによる TeXConf 2020 です.
xfakebold.sty とは?
xfakebold.sty (CTAN) とは, pdfファイル上で擬似的に太字を実現するコマンド \setBold を提供するパッケージで, LuaLaTeX または pdfLaTeXのみで利用可能です1.
\setBold コマンドを使うと, 以下のようになります2:
普通の文書での使い道はよくわかりませんが, bemaerで Computer Modern (などのセリフ系フォント) を使う場合に有効です.
実際, 自分がbeamerを使うときは \usefonttheme{professionalfonts} として数式だけ Computer Modern を使うので, xfakebold を重宝しています.
本稿では, beamer (またはスライド作成用クラスファイル) 上での利用を前提とした解説をします.
なお, 擬似的な太字はpdfのフォントのレンダリング方法を利用して実現しています. 詳しくはCTANにあるマニュアルを参照してください.
追記: @doraTeX さんが (u)pLaTeX への対応を考えてくださいました:
xfakebold.sty を (u)pLaTeX + dvipdfmx に対応させてみた
使い方
個人的にオススメの使い方
とりあえず, プリアンブルに以下を書くと, 数式だけが自動的に太くなり, スライド上で数式が見やすくなります3.
\usepackage[bold=0.2]{xfakebold} % bold の値はお好み. デフォルトは0.4
\everymath{\setBold\aftergroup\unsetBold}
\renewenvironment{equation}{\align}{\endalign}
\def\[#1\]{\begin{align*}#1\end{align*}}
\let\origtext\text
\renewcommand{\text}[1]{\origtext{\unsetBold\relax#1\setBold}}
4行目にヤバそうなものが見えますが, ともあれ, 以下で細かい部分を説明していきます.
パッケージの読み込み
\usepackage{xfakebold}
とすればよいです.
読み込み時のオプションとして, bold というパラメータを指定することができます (デフォルトは0.4).
このオプションは, 文字を何pt太くするか, を指定します.
例えば,
\usepackage[bold=0.5]{xfakebold}
とすると, 通常より0.5pt太くなります.
boldの値を変えた際の違いは以下のようになります.
個人的には, 0.2か0.3あたりがちょうどよいかなあと思います.
コマンド
\setBold と \unsetBold というコマンドが用意されています.
\setBold を使うと, それ以降のテキストが (数式だろうが何だろうが全て) 太くなります. \unsetBold を用いれば, それ以降のテキストが普通の太さで表示されます.
あいうえお \setBold あいうえお \unsetBold あいうえお
出力:
用意されているコマンドはこの2つだけです4.
パッケージの使い方自体はこれだけですが, 以下, 個人的な好みで色々と変更する, という話が続きます.
数式だけに \setBold する
上の使い方を見ればわかるように, \setBold の後ろは全てが太くなってしまいます.
そのため, フォント次第ではかえって読みにくくなってしまいます.
個人的には, beamerでの利用を考えると, 数式だけ太くしてくれればいいのに, と思います.
そこで, 数式のときだけ自動的に \setBold する方法を考えます.
インライン数式の場合
インライン数式で自動的に \setBold するには, プリアンブルに以下のように記述すると良いです.
\everymath{\setBold\aftergroup\unsetBold}
別行立て数式の場合
別行立て数式でも自動的に \setBold する場合, \everydisplay というコマンドの利用が考えられますが, これを用いると, amsmath.sty の align 環境などと衝突します.
実は, amsmath.sty を読み込んでいる場合は, 上の \everymath による記述によって, align 環境なども自動的に \setBold されます.
ということは, \[ ... \] による記述と equation・equaiton* 環境の3つだけ対処すれば良いのですが, うまい方法が思いつかなかったので, 思い切って, これらの環境を align 環境に置き換えることで対応することにします5.
まず, equation 環境は, 以下のようにすると書き換えられます6.
\renewenvironment{equation}{\align}{\endalign}
cf. newenvironment: error with \begin{align} and \end{align}
equation* 環境は使われることはないと思うので放置します.
\[ ... \] は以下のように書き換えます.
\def\[#1\]{\begin{align*}#1\end{align*}}
cf. Redefining \[ to \begin{align*}
本当にこんなことしていいのか? って感じがしますが, 動くので, これで良いということにします.
\text コマンド内の文字列
上のように対処すると, \text コマンドの中でも \setBold が有効になってしまうため, このコマンドを使う場合は, 少し見栄えがよくありません.
% プリアンブル
\everymath{\setBold\aftergroup\unsetBold}
\renewenvironment{equation}{\align}{\endalign}
\def\[#1\]{\begin{align*}#1\end{align*}}
% 本文
Poisson方程式
\[
\begin{cases}
-\Delta u = f & \text{in } \Omega, \\
u = 0 & \text{on } \partial\Omega
\end{cases}
\]
を考える.
上の出力を見ると, \text コマンド内の in と on が太くなってしまっています.
これを回避するためには, \text{\unsetBold ... \setBold} という感じで \unsetBold と \setBold を入れてあげればよいですが, 毎回入れるのは面倒です.
そこで, 以下のように \text コマンドを再定義しちゃいましょう7.
% プリアンブル
\everymath{\setBold\aftergroup\unsetBold}
\renewenvironment{equation}{\align}{\endalign}
\def\[#1\]{\begin{align*}#1\end{align*}}
% \text コマンドを再定義
\let\origtext\text
\renewcommand{\text}[1]{\origtext{\unsetBold\relax#1\setBold}}
% 本文
Poisson方程式
\[
\begin{cases}
-\Delta u = f & \text{in } \Omega, \\
u = 0 & \text{on } \partial\Omega
\end{cases}
\]
を考える.
並べてみるとだいぶ違います.
まとめると, 以下のように使うのが個人的なオススメです8.
\usepackage[bold=0.2]{xfakebold} % bold の値はお好み. デフォルトは0.4
\everymath{\setBold\aftergroup\unsetBold}
\renewenvironment{equation}{\align}{\endalign}
\def\[#1\]{\begin{align*}#1\end{align*}}
\let\origtext\text
\renewcommand{\text}[1]{\origtext{\unsetBold\relax#1\setBold}}
フォントサイズに応じて相対的に太さを変える
xfakebold.sty は, ポイントでどれだけ太くするかを指定します.
したがって, 文字サイズが変更されると, 太くなる割合も変化してしまいます.
そこで, LuaLaTeX 限定ですが, xfakebold を読み込む代わりに, 以下のようにすれば, 相対的に余分な太さを指定することができます.
\usepackage{ifthen}
\makeatletter
\newcommand{\r@tio}{2}
\newcommand{\setBold}{%
\ifthenelse{\equal{\f@series}{bx}}{%
\renewcommand{\r@tio}{5}%
}{%
\renewcommand{\r@tio}{2}%
}%
\pdfextension literal direct { 2 Tr \directlua{tex.print(0.01*\r@tio*\f@size)} w }\relax
}
\newcommand{\unsetBold}{\pdfextension literal direct { 2 Tr 0 w }\relax}
\makeatother
\r@tio はフォントサイズに対する太くなる割合 (パーセント) を意味しています.
\f@series は現在のフォントシリーズ (太字とか) を, \f@size は現在のフォントサイズを返します.
なお, ifthen パッケージを使わなくても同じことができると思いますが, 使った方が楽だと思います.
他にも, \pdfextension literal direct { 2 Tr 数字 w } という表現を駆使すれば, 自分だけの fakebold を作ることができます9.
終わりに
LuaLaTeX または pdfLaTeX で擬似的な太字を実現する xfakebold というパッケージを紹介しました.
主な用途はbeamerで文字を太して読みやすくすることだと思います.
他に有効な使い道があったら教えてください.
宣伝
付録: \varepsilon が汚い
汚い10.
お分かり頂けただろうか.
-
XeLaTeXでは fontspec.sty の FakeBold オプションを使えば良い, らしい. ↩
-
フォントはメイリオと Segoe UI を用いています. ↩
-
個人の感想です. ↩
-
実は
\fake@boldというコマンドもあり, オプションboldの値はこのコマンドに取り込まれます. したがって,\fake@boldを途中で\renewcommandすると, 途中で太さを変えることができます. ↩ -
紹介する方法が良い方法とは思っていませんが, とりあえず動くので... より良い方法があれば教えて下さい. ↩
-
自分はスライドで相互参照を使わないので, 自分のスライドにはこの記述はしないのですが. ↩
-
実は, この状態で
\textコマンド内に数式を書くと, なぜか数式が太くなりません. この問題を回避するためには,\renewcommandの部分は\renewcommand{\text}[1]{\origtext{\everymath{\setBold\aftergroup\unsetBold}\unsetBold\relax#1\setBold}}としないといけません. が,\textコマンド内で数式を使うことはあまりないと思うので, 適宜\setboldを書くというのでも良いと思います. と言いつつ自分はこの長い\renewcommandを使っています. これ, どうにかならないのでしょうか. ↩ -
もちろん (?), amsmath パッケージは読み込まれているものとします. ↩
-
実は, xfakebold.sty の中身は, 本質的にはこれだけです. ↩
-
モニターやソフトウェアに依存する現象かも? ↩

