本稿は 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 の中身は, 本質的にはこれだけです. ↩
-
モニターやソフトウェアに依存する現象かも? ↩