現在,TeX & LaTeX Advent Calendar 2019 が開催中です。
その2日目の記事が,t_kemmochi さんによる xfakebold.sty の紹介でした。
この記事で紹介されている xfakebold.sty は,LuaLaTeX または pdfLaTeXのみで利用可能 とされています。つまり,(u)pLaTeX + dvipdfmx のワークフローはサポートされていません。
ですが,xfakebold.sty
の中身を読んでみると,\setBold
や \unsetBold
という命令は,単にPDFに 2 Tr 0.5 w
といったオペレータを埋め込んでいるだけです。以前の記事で紹介したように,(x)dvipdfmx を使っている場合は,\special{pdf:literal direct ...}
とすることでこれらのオペレータを埋め込むことが可能です。
doratex.hatenablog.jp
よって,定義をちょっと変更して場合分けを増やせば,xfakebold.sty
を (x)dvipdfmx に対応させることは容易なはずです。
そもそも,xfakebold.sty
は,XeLaTeX, LuaLaTeX, pdfLaTeX 以外のエンジンのことは全く考慮されていないようです(XeLaTeX の場合は fontspec に任せる旨の警告を出して終わり)。
xfakebold.sty を読んだ.本当に素朴だった.ところでエンジン判定について
— ワトソン (@wtsnjp) 2019年12月2日
\ifxetex
警告して終了
\else\ifluatex
LuaTeX 用の処理
\else
pdfTeX 用の処理
\fi\fi
となっており,要するに「世界には TeX 処理系は pdfTeX, XeTeX, LuaTeX しか存在しない」仮定がおかれている…… #TeX言語
というわけで,これらの欠点を解決すべく,xfakebold.sty
にさくっと手を入れて,(u)pLaTeX + dvipdfmx に対応させてみました。
仕様
iftex.sty
を用いてエンジンを判定。- XeLaTeX の場合は fontspec に任せるのではなく自力で
\special
を発行。 - ドキュメントクラスオプション,または
xfakebold
パッケージのパッケージオプションとしてdvipdfmx
が指定されている場合((u)pLaTeX + dvipdfmx のワークフローを想定)も,自力で\special
を発行。 - LuaLaTeX / pdfLaTeX の場合は原作通りの挙動。
- 以上のいずれにも当てはまらない場合は非サポートエンジンのエラーを出す。
サンプル
t_kemmochi さんのサンプルを,upLaTeX + dvipdfmx + Beamer + 改造版xfakebold で動かした例を作ってみました。