Situação

Situação

Esta é uma pergunta XeLaTeX. Parece muito bobo perguntar depois de muitos anos de uso fontspecdo 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:

  1. Fontes integradas do TeX Live (assumindo as mesmas do MikTeX)
  2. Arquivos de fontes no repositório

NÃO fontes do sistemaconforme listado por fc-list -f "%{family}\n" | sort -uem máquinas baseadas em Unix.

Carregando fontes comfontspec

Emfontespec, as fontes são carregadas de várias maneiras:

  1. 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
  1. 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. fontspecestá 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.

Quais pacotes de fontes estão instalados no TeX live?

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 OPENTYPEFONTSe TTFFONTSé uma tarefa executada pela kpsebiblioteca, a qual xetexestá vinculada, então o usuário faznãoprecisa configurá-los: eles são configurados automaticamente assim que xetexsã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 ( sudoou 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 \testpathfamília só é definida para verificação cruzada de que é \testkpsesuficiente.

\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.

insira a descrição da imagem aqui

Responder2

Usar

 \setmonofont{Inconsolatazi4}

ou

 \setmonofont[
   BoldFont=Inconsolatazi4-Bold.otf]{Inconsolatazi4-Regular.otf}

Por padrão fontconfig, que é usado xetex/xelatexpara pesquisar arquivos de fontes, não verifica os diretórios de fontes do TeX. Mas xetex/xelatexuse 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.

informação relacionada