为什么 \setdefaultlanguage 会修改我的字体系列?

为什么 \setdefaultlanguage 会修改我的字体系列?

请参阅此示例代码

\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

这有两个问题:

  1. 可以说,它应该在文档开始时完成,而不是在包加载期间完成,以允许用户\familydefault在序言中的任何位置重新定义(并且我个人希望也能够在文档主体中定义它,但我不太清楚为什么polyglossia需要它自己的\familytype而不是\familydefault,从而限制了后者的效率)。

  2. 限制\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}

相关内容