この記事は、TeX & LaTeX Advent Calendar 17日目の記事です。

注意:もっぱらW32TeXでdvipdfmxを使っています。以降の話もdvipdfmx以外では当てはまらないことがほとんどだと思います。

欧文書体を変更するには、任意のOpenTypeフォントを使うにはどうすればよいのか、試行錯誤していました。やっとのことで、どうやらLCDF Typetoolsのotftotfmコマンドを使うのがよいということが分かり、試してみました。


ここではSource Code Proを使用しました。あらかじめ、ダウンロード・展開しておきます。また、フォントファイルを$TEXMFLOCAL/fonts/opentypeにシンボリックリンクまたはコピーしておきます。

  1. LCDF Typetoolsを導入しておく。
  2. otftotfmコマンドを実行する。
  3. fdファイルを用意する。

まずはLCDF Typetoolsです。私はW32TeXを使っているので、lcdf-typetools-w32.tar.xzをダウンロード・解凍しました。

次に、otftotfmコマンドを実行します。-aオプションを使用すると、一通りのファイルを$TEXMFLOCAL下の適当な場所に自動で設置してくれるので便利です(逆に言えば、だんだん勝手に「汚れていく」欠点とも言えます)。

otftotfm -a -e ec D:\……\SourceCodePro-Black.otf
otftotfm -a -e ec D:\……\SourceCodePro-Bold.otf
otftotfm -a -e ec D:\……\SourceCodePro-ExtraLight.otf
otftotfm -a -e ec D:\……\SourceCodePro-Light.otf
otftotfm -a -e ec D:\……\SourceCodePro-Regular.otf
otftotfm -a -e ec D:\……\SourceCodePro-Semibold.otf

otftotfmのドキュメントのEXMAPLEでは、-fkern -fligaなどを指定していますが、私がやろうとしているものは等幅フォントなので不要なのだろうかと考えています。

3つめの手順がFDファイルの作成です。$TEXMFLOCAL/tex/latexの下の適当なところに作成します。名前は“(エンコーディング)(フォント名).fd”とします。今回はT1SourceCodePro.fdとしました。中身はこのようにします。

\DeclareFontFamily{T1}{SourceCodePro}{}
\DeclareFontShape{T1}{SourceCodePro}{el}{n}{<->SourceCodePro-ExtraLight--ec}{}
\DeclareFontShape{T1}{SourceCodePro}{l}{n}{<->SourceCodePro-Light--ec}{}
\DeclareFontShape{T1}{SourceCodePro}{m}{n}{<->SourceCodePro-Regular--ec}{}
\DeclareFontShape{T1}{SourceCodePro}{sb}{n}{<->SourceCodePro-Semibold--ec}{}
\DeclareFontShape{T1}{SourceCodePro}{b}{n}{<->SourceCodePro-Bold--ec}{}
\DeclareFontShape{T1}{SourceCodePro}{eb}{n}{<->SourceCodePro-Black--ec}{}

\DeclareFontShapeの行は必要に応じて追加・削除します。たとえば、RegularやBoldしかないフォントであれば{m}と{b}の2行になるでしょう。

\DeclareFontFamilyと\DeclareFontShapeで書いているSourceCodeProはLaTeX上での書体の名前になります。

問題は<->の右側です。SourceCodePro-ExtraLight–ecの部分に適切な値を埋めなければなりません。ここに当てはめるべき値を知るため、私はいつも$TEXMFLOCAL/fonts/map/dvips/lcdftools/lcdftools.mapを確認しています。

% Automatically maintained by otftotfm or other programs. Do not edit.

SourceCodePro-ExtraLight--ec--base SourceCodePro-ExtraLight "AutoEnc_wk7bimofdqwaywv3e2nz4uncag ReEncodeFont" <[a_wk7bim.enc <SourceCodePro-ExtraLight.pfb
SourceCodePro-Light--ec--base SourceCodePro-Light "AutoEnc_wk7bimofdqwaywv3e2nz4uncag ReEncodeFont" <[a_wk7bim.enc <SourceCodePro-Light.pfb
SourceCodePro-Regular--ec--base SourceCodePro-Regular "AutoEnc_wk7bimofdqwaywv3e2nz4uncag ReEncodeFont" <[a_wk7bim.enc <SourceCodePro-Regular.pfb
SourceCodePro-Semibold--ec--base SourceCodePro-Semibold "AutoEnc_wk7bimofdqwaywv3e2nz4uncag ReEncodeFont" <[a_wk7bim.enc <SourceCodePro-Semibold.pfb
SourceCodePro-Bold--ec--base SourceCodePro-Bold "AutoEnc_wk7bimofdqwaywv3e2nz4uncag ReEncodeFont" <[a_wk7bim.enc <SourceCodePro-Bold.pfb
SourceCodePro-Black--ec--base SourceCodePro-Black "AutoEnc_wk7bimofdqwaywv3e2nz4uncag ReEncodeFont" <[a_wk7bim.enc <SourceCodePro-Black.pfb

一番左側のSourceCodePro-Regular–ec–baseから末尾–baseを取り除いたものを抜き出します。

  • SourceCodePro-ExtraLight--ec
  • SourceCodePro-Light--ec
  • SourceCodePro-Regular--ec
  • SourceCodePro-Semibold--ec
  • SourceCodePro-Bold--ec
  • SourceCodePro-Black--ec

これがfdファイルの\DeclareFontShapeで当てはめるべき値となるようです。

FDファイルの作成については、LaTeX に新しいフォントを持ち込む話 – マクロツイーターが参考になります。

\documentclass{article}
\usepackage[T1]{fontenc}
\begin{document}
\newcommand*\sampleText{The quick brown fox jumps over the lazy dog}
\fontencoding{T1}\fontfamily{SourceCodePro}
\fontseries{el}\selectfont \sampleText \par
\fontseries{l}\selectfont  \sampleText \par
\fontseries{m}\selectfont  \sampleText \par
\fontseries{sb}\selectfont \sampleText \par
\fontseries{b}\selectfont  \sampleText \par
\fontseries{eb}\selectfont \sampleText \par
\end{document}

さっそく試してみましょう。

\documentclass{article}
\usepackage[T1]{fontenc}
\begin{document}
\newcommand*\sampleText{The quick brown fox jumps over the lazy dog}
\fontencoding{T1}\fontfamily{SourceCodePro}
\fontseries{el}\selectfont \sampleText \par
\fontseries{l}\selectfont  \sampleText \par
\fontseries{m}\selectfont  \sampleText \par
\fontseries{sb}\selectfont \sampleText \par
\fontseries{b}\selectfont  \sampleText \par
\fontseries{eb}\selectfont \sampleText \par
\end{document}

dvipdfmxに-f lcdftools.mapを追加する必要があります。当然、latex、platex、uplatexいずれでも利用可能です。

さて、私が等幅フォントを使う理由は、もっぱらプログラムのソースコードを図示するためなので、普段はこんな風にlistingsと併せて使っています。

\documentclass{jsarticle}
\usepackage[T1]{fontenc}
\usepackage[dvipdfmx,svgnames]{xcolor}
\usepackage{listings,jlisting}
\renewcommand{\ttdefault}{SourceCodePro}
\begin{document}
\lstset{%
  language=[ISO]C++,%
  basicstyle=\ttfamily,%
  keywordstyle=\color{DarkBlue},%
  stringstyle=\color{DarkMagenta},%
  frame=trBL,%
  columns=fullflexible,%
  tabsize=2}
 
\begin{lstlisting}
/ ring1.c /
#include<studio.h>
#include<math.h>
main()
float r, th, dth, x, y;
dth = 0.02*M_Pl;
r = 1.0;
for(th=0.-;th<=2.0*M_Pl;th=th+dth ) {
x = r*cos(th);
y = r*sin(th);
printf( "%f %f \n" ,x,y);
return 0;
\end{lstlisting}
\end{document}

このソースコードは、【studio.h】池上彰さんの番組内の円描画プログラムのようなものに対する反応 – Togetterより引用させていただきました(いわゆる全角文字について半角文字に変えています)。


スポンサード リンク

この記事のカテゴリ

  • ⇒ LCDF TypetoolsでOpenTypeフォントを使う(DVIPDFMXで)