
これは XeLaTeX に関する質問です。長年fontspec
XeLaTeX を使ってきた後でこのような質問をするのは本当に馬鹿げているように思えます。これまでは常に回避策を見つけてきたと思います。今回は、明確な答えが欲しいです。
状況
サーバー (コンパイラ/ビルド システム) はバックグラウンドで実行されており、バージョン管理リポジトリからドキュメント (およびその他の操作) を 24 時間体制で生成しています。ドキュメントは複数のクライアントで人間によって編集されます。システム フォントがどのマシンでも同じであるとは想定できません。すべてのマシンで同じである (または少なくとも同じであるべき) ものが 2 つあります。1. TeX Live バージョン/MikTeX。2. リポジトリ ファイル。これは、ロードするフォントが次のいずれかである必要があることを意味します。
- TeX Live 組み込みフォント (MikTeX と同じと想定)
- リポジトリ内のフォントファイル
システムフォントではないfc-list -f "%{family}\n" | sort -u
Unix ベースのマシンでリストされているとおりです。
フォントを読み込むfontspec
でフォントスペックフォントはいくつかの方法で読み込まれます。
- 拡張子付きファイル名
例えば
\setmainfont{texgyrepagella-regular.otf}
\let\texgyrepagellaregular\normalfont % create semantically relevant macro (name+font) to be consistent with other \newfontfamily macros
- 拡張子なしのファイル名ですが、パス構築式がパラメータとして指定されています。
例えば
\setmainfont{texgyrepagella}[
Path = /Users/will/Fonts/ ,
UprightFont = *-regular ,
BoldFont = *-bold ,]
/usr/local/texlive/<YEAR>/
フォントが同じ場所にない可能性があるため、[...]と入力してフォントをロードすることは避けたいと思います。
試み
\documentclass{article}
\usepackage{fontspec}
\setmonofont{Inconsolata}
\newcommand\escapedlog[1]{\par\ttfamily #1\par}
\begin{document}
Keep it simple.
\escapedlog{Hello}
\end{document}
ログ出力(エラー)
ここで何が起こっているのかわかっていると思います。fontspec
システム フォントのリストのみをチェックしていますfc-list -f "%{family}\n" | sort -u
。
kpathsea: Running mktextfm inconsolata
mktextfm: Running mf-nowin -progname=mf \mode:=ljfour; mag:=1; nonstopmode; input inconsolata
This is METAFONT, Version 2.7182818 (TeX Live 2015) (preloaded base=mf)
kpathsea: Running mktexmf inconsolata
! I can't find file `inconsolata'.
<*> ...our; mag:=1; nonstopmode; input inconsolata
Please type another input file name
! Emergency stop.
<*> ...our; mag:=1; nonstopmode; input inconsolata
Transcript written on mfput.log.
grep: inconsolata.log: No such file or directory
mktextfm: `mf-nowin -progname=mf \mode:=ljfour; mag:=1; nonstopmode; input inconsolata' failed to make inconsolata.tfm.
kpathsea: Appending font creation commands to missfont.log.
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!
! fontspec error: "font-not-found"
!
! The font "inconsolata" cannot be found.
!
! See the fontspec documentation for further information.
!
! For immediate help type H <return>.
!...............................................
l.3 \setmonofont{inconsolata}
?
従来のパッケージ
このリストによれば、そのフォントがインストールされているはずです。
答え1
フォントがXeTeXによって検索されるディレクトリにある限り、明示的なパスを指定する必要はありません。関連する(疑似)環境変数は次のとおりです。
% TrueType outline fonts.
TTFONTS = .;$TEXMF/fonts/{truetype,opentype}//;$OSFONTDIR//
% OpenType outline fonts.
OPENTYPEFONTS = .;$TEXMF/fonts/{opentype,truetype}//;$OSFONTDIR//
ユーザーは環境変数 を設定できますOSFONTDIR
が、 と の設定はOPENTYPEFONTS
にリンクされているライブラリTTFFONTS
によって実行されるタスクであるため、ユーザーはkpse
xetex
ないxetex
設定する必要はありません。起動すると自動的に設定されます。
オペレーティングシステムによっては、現在のTeXディストリビューションのフォントをシステムに認識させることができます。TeX Liveのインストールガイドに記載されているように、ほとんどのGNU/Linuxシステムでは、
cp $(kpsewhich -var-value TEXMFSYSVAR)/fonts/conf/texlive-fontconfig.conf /etc/fonts/conf.d/09-texlive.conf
fc-cache -fsv
スーパーユーザー権限(sudo
または同等の権限)があれば、TeX Live OpenType および TrueType フォントが OS で利用できるようになります。
最初のコマンドは毎年の TeX Live リリース後にロードされ、2 番目のコマンドは で更新または新しいフォントがインストールされたときに実行されますtlmgr
。私はこれを GNU/Linux ボックスで実行します。
\testpath
次に示すのは、十分であることをクロスチェックするためだけにファミリが定義されている例です\testkpse
。
\documentclass{article}
\usepackage{fontspec}
\newfontfamily{\testkpse}{Inconsolatazi4}[
Extension=.otf,
UprightFont=*-Regular,
BoldFont=*-Bold,
]
\newfontfamily{\testpath}{Inconsolatazi4}[
Extension=.otf,
Path=/usr/local/texlive/2016/texmf-dist/fonts/opentype/public/inconsolata/,
UprightFont=*-Regular,
BoldFont=*-Bold,
]
\newfontfamily{\testfc}{Inconsolatazi4}
\begin{document}
\pagestyle{empty}
{\testkpse Inconsolata \bfseries Bold}
{\testpath Inconsolata \bfseries Bold}
{\testfc Inconsolata \bfseries Bold}
\end{document}
この例を実行すると
xelatex -output-driver="xdvipdfmx -vv" test
端末に次の情報が表示されます
<FONTMAP:/usr/local/texlive/2016/texmf-var/fonts/map/pdftex/updmap/pdftex.map><FONTMAP:/usr/local/texlive/2016/texmf-var/fonts/map/dvipdfmx/updmap/kanjix.map><FONTMAP:/usr/local/texlive/2016/texmf-dist/fonts/map/dvipdfmx/ckx.map>No dvi filename specified, reading standard input.
stdin -> incons.pdf
DVI Comment: XeTeX output 2016.06.09:1437
<AGL:texglyphlist.txt><AGL:pdfglyphlist.txt><AGL:glyphlist.txt>[1</usr/local/texlive/2016/texmf-dist/fonts/opentype/public/inconsolata/[email protected]<NATIVE-FONTMAP:/usr/local/texlive/2016/texmf-dist/fonts/opentype/public/inconsolata/Inconsolatazi4-Regular.otf/0/H/65536/0/0>
pdf_font>> Input encoding "Identity-H" requires at least 2 bytes.
pdf_font>> The -m <00> option will be assumed for "/usr/local/texlive/2016/texmf-dist/fonts/opentype/public/inconsolata/Inconsolatazi4-Regular.otf".
(CID:Inconsolatazi4-Regular)
pdf_font>> Type0 font "/usr/local/texlive/2016/texmf-dist/fonts/opentype/public/inconsolata/Inconsolatazi4-Regular.otf" cmap_id=<Identity-H,0> opened at font_id=</usr/local/texlive/2016/texmf-dist/fonts/opentype/public/inconsolata/Inconsolatazi4-Regular.otf/0/H/65536/0/0,0>.
></usr/local/texlive/2016/texmf-dist/fonts/opentype/public/inconsolata/[email protected]<NATIVE-FONTMAP:/usr/local/texlive/2016/texmf-dist/fonts/opentype/public/inconsolata/Inconsolatazi4-Bold.otf/0/H/65536/0/0>
pdf_font>> Input encoding "Identity-H" requires at least 2 bytes.
pdf_font>> The -m <00> option will be assumed for "/usr/local/texlive/2016/texmf-dist/fonts/opentype/public/inconsolata/Inconsolatazi4-Bold.otf".
(CID:Inconsolatazi4-Bold)
pdf_font>> Type0 font "/usr/local/texlive/2016/texmf-dist/fonts/opentype/public/inconsolata/Inconsolatazi4-Bold.otf" cmap_id=<Identity-H,0> opened at font_id=</usr/local/texlive/2016/texmf-dist/fonts/opentype/public/inconsolata/Inconsolatazi4-Bold.otf/0/H/65536/0/0,1>.
></usr/local/texlive/2016/texmf-dist/fonts/opentype/public/inconsolata/[email protected]></usr/local/texlive/2016/texmf-dist/fonts/opentype/public/inconsolata/[email protected]></usr/local/texlive/2016/texmf-dist/fonts/opentype/public/inconsolata/[email protected]></usr/local/texlive/2016/texmf-dist/fonts/opentype/public/inconsolata/[email protected]>]
otf_cmap>> Creating ToUnicode CMap for "/usr/local/texlive/2016/texmf-dist/fonts/opentype/public/inconsolata/Inconsolatazi4-Regular.otf"...
otf_cmap>> Creating ToUnicode CMap for "/usr/local/texlive/2016/texmf-dist/fonts/opentype/public/inconsolata/Inconsolatazi4-Bold.otf"...
(CID:/usr/local/texlive/2016/texmf-dist/fonts/opentype/public/inconsolata/Inconsolatazi4-Regular.otf[CIDFontType0])(CID:/usr/local/texlive/2016/texmf-dist/fonts/opentype/public/inconsolata/Inconsolatazi4-Bold.otf[CIDFontType0])
それぞれのケースで正しいフォントが選択されていることを示します。
答え2
使用
\setmonofont{Inconsolatazi4}
または
\setmonofont[
BoldFont=Inconsolatazi4-Bold.otf]{Inconsolatazi4-Regular.otf}
デフォルトではfontconfig
、 がフォント ファイルの検索に使用する は、xetex/xelatex
TeX フォント ディレクトリをスキャンしません。ただし、xetex/xelatex
を使用するkpsewhich
と、完全な名前でフォントが検索されます。これらのファイルをシステムのフォント ディレクトリに配置するか、 の検索パスを拡張することができますfontconfig
。その後、シンボリック名を使用できます。