
Это вопрос по XeLaTeX. Кажется, это действительно глупо спрашивать после многих лет использования fontspec
и XeLaTeX. Я полагаю, что я всегда находил обходной путь. На этот раз я хотел бы получить окончательный ответ.
Ситуация
Сервер (компилятор/система сборки) работает в фоновом режиме, круглосуточно генерируя документы (среди прочих операций) из репозиториев контроля версий. Документы редактируются на нескольких клиентах людьми. Нельзя предположить, что системные шрифты одинаковы на любой из машин.Есть две вещи, которые одинаковы на всех машинах (или, по крайней мере, должны быть одинаковыми): 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 будут доступны для ОС.
Первую команду следует загрузить после ежегодного выпуска TeX Live, вторую — запустить при установке обновлений или новых шрифтов с помощью 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
. Тогда можно использовать символическое имя.