有没有办法检查 XeLaTeX 中是否存在字体?我知道检查 XeLaTeX 中缺少的字体/字符?,但遗憾的是,答案仅涉及日志。我对通过代码进行测试感兴趣。
背景:
我正在尝试定义一个命令来检查一系列字体并使用它找到的第一个字体(类似于 CSS 属性)
p{font-family:"Times New Roman",Georgia,Serif;}
我打算使用 pgf 键,这里有一个 MWE 示例。
\documentclass{article}
\usepackage{ifxetex}
% Generic defaults
\ifxetex
\usepackage{fontspec}
\defaultfontfeatures{Mapping=tex-text}
\setmainfont{Times New Roman}
\setsansfont{Minion Pro}
\else
\usepackage{mathpazo}
\usepackage[T1]{fontenc}
\fi
\usepackage{pgfkeys}
\usepackage{lipsum}
\makeatletter
% keys
\pgfkeys{/fonts/.is family}
\def\cxset{\pgfqkeys{/fonts}}
\cxset{%
serif/.code=\rmfamily,
Serif/.code=\rmfamily,
font-name/.store in =\fontname@cx,
}
\cxset{
serif,
font-name=Times New Roman,
}
\ifxetex
\defaultfontfeatures{Mapping=tex-text}
% code to be added here for iterating through list etc..
\setmainfont{\fontname@cx}
\setsansfont{Minion Pro}
\fi
\makeatother
\begin{document}
\lipsum[1]
\end{document}
最终的关键
font-family={Times New Roman, Some Other Font, Another Font, serif}
应该遍历所有字体名称。如果未找到任何内容,则衬线值将触发默认值\rmfamily
。我可以编写迭代等代码,但我在测试中遇到困难。
答案1
这有帮助吗(取自XeTeX 邮件列表):
\documentclass{article}
\begin{document}
\def\myfont{"Persian Modern"}% first preferred font
\def\myfallback{"XB Zar"} % if first font not avaliable
\count255=\interactionmode
\batchmode
\font\bodyfont=\myfont\space at 10pt
\ifx\bodyfont\nullfont
\font\bodyfont = \myfallback\space at 10pt
\ifx\bodyfont\nullfont
\errorstopmode
\errmessage{no suitable font found}
\else
\let\myfont=\myfallback
\fi
\fi
\interactionmode=\count255
\bodyfont
This is a test.
\end{document}
答案2
基于 Simurgh 的答案这是第一次尝试检查多种字体。为了方便起见,我运行了整个循环,尽管在找到第一个字体时可能需要中断。
\documentclass{article}
\usepackage{fontspec}
\def\alist{Times New Roman,Tahoma,test}
\parindent0pt
\begin{document}
\makeatletter
\count255=\interactionmode
\batchmode
\@for\next:=\alist\do{%
\expandafter\newfontfamily\csname\next\endcsname{\next}
\setbox0=\hbox{\csname\next\endcsname A}
\ifdim\ht0=0pt \next\ does not exist\\ \else \next\ does exist\\\fi
}
\interactionmode=\count255
\makeatother
\end{document}
由于 XeLaTeX 通常会在几秒钟内保持沉默来寻找字体,因此如果您运行 MWE,请耐心等待。