
Esta é uma pergunta XeLaTeX. Parece muito bobo perguntar depois de muitos anos de uso fontspec
do XeLaTeX. Suponho que sempre encontrei uma solução alternativa. Desta vez, gostaria de uma resposta definitiva.
Situação
Um servidor (compilador/sistema de compilação) está sendo executado em segundo plano, gerando documentos (entre outras operações) a partir de repositórios de controle de versão 24 horas por dia. Os documentos são editados em vários clientes por humanos. Não se pode presumir que as fontes do sistema sejam as mesmas em qualquer uma das máquinas.Há duas coisas que são iguais em todas as máquinas (ou pelo menos deveriam ser): 1. a versão TeX Live/MikTeX. 2. Os arquivos do repositório.Isso implica que todas as fontes que eu carregar devem estar em:
- Fontes integradas do TeX Live (assumindo as mesmas do MikTeX)
- Arquivos de fontes no repositório
NÃO fontes do sistemaconforme listado por fc-list -f "%{family}\n" | sort -u
em máquinas baseadas em Unix.
Carregando fontes comfontspec
Emfontespec, as fontes são carregadas de várias maneiras:
- Nome do arquivo com extensão
por exemplo
\setmainfont{texgyrepagella-regular.otf}
\let\texgyrepagellaregular\normalfont % create semantically relevant macro (name+font) to be consistent with other \newfontfamily macros
- Nome de arquivo sem extensão, mas com expressões de construção de caminho fornecidas como parâmetros:
por exemplo
\setmainfont{texgyrepagella}[
Path = /Users/will/Fonts/ ,
UprightFont = *-regular ,
BoldFont = *-bold ,]
Eu gostaria de evitar carregar fontes digitando /usr/local/texlive/<YEAR>/
[...] porque elas podem não estar localizadas no mesmo local.
Tentar
\documentclass{article}
\usepackage{fontspec}
\setmonofont{Inconsolata}
\newcommand\escapedlog[1]{\par\ttfamily #1\par}
\begin{document}
Keep it simple.
\escapedlog{Hello}
\end{document}
Saída de registro (erro)
Acho que sei o que está acontecendo aqui. fontspec
está verificando apenas a lista de fontes do sistema 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}
?
Pacotes Tradicionais
De acordo com esta lista, devo ter essa fonte instalada.
Responder1
Você não precisa fornecer um caminho explícito, desde que a fonte esteja em um diretório pesquisado pelo XeTeX. As variáveis (pseudo)ambientais relevantes são
% TrueType outline fonts.
TTFONTS = .;$TEXMF/fonts/{truetype,opentype}//;$OSFONTDIR//
% OpenType outline fonts.
OPENTYPEFONTS = .;$TEXMF/fonts/{opentype,truetype}//;$OSFONTDIR//
Um usuário pode definir no ambiente a variável OSFONTDIR
, mas configurar OPENTYPEFONTS
e TTFFONTS
é uma tarefa executada pela kpse
biblioteca, a qual xetex
está vinculada, então o usuário faznãoprecisa configurá-los: eles são configurados automaticamente assim que xetex
são iniciados.
Dependendo do sistema operacional, você pode tornar o sistema ciente das fontes na distribuição atual do TeX. Conforme descrito no guia de instalação do TeX Live, na maioria dos sistemas GNU/Linux você pode executar
cp $(kpsewhich -var-value TEXMFSYSVAR)/fonts/conf/texlive-fontconfig.conf /etc/fonts/conf.d/09-texlive.conf
fc-cache -fsv
com privilégios de superusuário ( sudo
ou similar) e as fontes TeX Live OpenType e TrueType estarão disponíveis para o sistema operacional.
O primeiro comando deve ser carregado após o lançamento anual do TeX Live, o segundo deve ser executado quando atualizações ou novas fontes forem instaladas com tlmgr
. Eu faço isso em minhas caixas GNU/Linux.
Aqui está um exemplo, onde a \testpath
família só é definida para verificação cruzada de que é \testkpse
suficiente.
\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}
Executando este exemplo com
xelatex -output-driver="xdvipdfmx -vv" test
mostrará as seguintes informações no terminal
<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])
que mostra que a fonte correta é escolhida em cada caso.
Responder2
Usar
\setmonofont{Inconsolatazi4}
ou
\setmonofont[
BoldFont=Inconsolatazi4-Bold.otf]{Inconsolatazi4-Regular.otf}
Por padrão fontconfig
, que é usado xetex/xelatex
para pesquisar arquivos de fontes, não verifica os diretórios de fontes do TeX. Mas xetex/xelatex
use kpsewhich
, razão pela qual encontrará fontes com o nome completo. Pode-se colocar esses arquivos no diretório de fontes do sistema ou estender o caminho de pesquisa para fontconfig
. Então pode-se usar o nome simbólico.