请参阅此示例代码
\documentclass{article}
\usepackage{polyglossia}
\setdefaultlanguage[spelling=new]{german}
\renewcommand*\familydefault{\sfdefault}
\begin{document}
test
\end{document}
test
写的\rmfamily
不是\sffamily
。但是当你删除第三行时\setdefaultlanguage
就会使用正确的字体。
为什么?这背后有什么原因?
答案1
这可以说是多语种的一个错误。检查 ,你polyglossia.sty
会发现它有一个 的概念\familytype
。当用户选择了一种语言时,字体选择会受其影响,这会测试 的值\familytype
。
在包加载期间需要设置一些代码\familytype
:
\expandafter\ifx\familydefault\sfdefault
\def\familytype{sf}
\else\expandafter\ifx\familydefault\ttdefault
\def\familytype{tt}
\else
\def\familytype{rm}
\fi\fi
这有两个问题:
可以说,它应该在文档开始时完成,而不是在包加载期间完成,以允许用户
\familydefault
在序言中的任何位置重新定义(并且我个人希望也能够在文档主体中定义它,但我不太清楚为什么polyglossia
需要它自己的\familytype
而不是\familydefault
,从而限制了后者的效率)。限制
\expandafter\ifx\familydefault
用户\familydefault
以某种方式定义 ,实际上它限制它必须采用 OP 的风格:\renewcommand*\familydefault{\sfdefault}
。 特别是\let\familydefault\sfdefault
会导致意想不到的结果。 但理想情况下应该使用完整扩展。
因此有两种解决方法:第一种方法是\renewcommand*\familydefault{\sfdefault}
前加载,替代方法是在序言末尾polyglossia
进行。\def\familytype{sf}
第一种方法:
\documentclass{article}
\renewcommand*\familydefault{\sfdefault}
\usepackage{polyglossia}
\setdefaultlanguage[spelling=new]{german}
\def\test{test}
%\def\familytype{sf}
% \tracingmacros1
\begin{document}
\test
\end{document}
% Local Variables:
% TeX-engine: xetex
% End:
第二种方法:
\documentclass{article}
%\renewcommand*\familydefault{\sfdefault}
\usepackage{polyglossia}
\setdefaultlanguage[spelling=new]{german}
\def\test{test}
\def\familytype{sf}
% \tracingmacros1
\begin{document}
\test
\end{document}
% Local Variables:
% TeX-engine: xetex
% End:
答案2
\AtBeginDocument{\normalfont}
在之后的任何地方添加序言\setdefaultlanguage
也是一种解决方法
\documentclass{article}
\usepackage{polyglossia}
\setdefaultlanguage[spelling=new]{german}
\AtBeginDocument{\normalfont}
\renewcommand*\familydefault{\sfdefault}
\begin{document}
test
\end{document}