由于 `\renewcommand{\familydefault}{\sfdefault}` 导致输出中缺少字符

由于 `\renewcommand{\familydefault}{\sfdefault}` 导致输出中缺少字符

这是关于以下内容的后续问题:使用 \usepackage[greek]{babel} 时以希腊文脚本设置的 ASCII 文本

当我们有如下 MWE 时:

\documentclass[twoside]{book}

\usepackage{fontspec}
\usepackage[greek]{babel}
\usepackage{alphabeta}
\setmainfont{Libertinus Serif}

\renewcommand{\familydefault}{\sfdefault}

\begin{document}

{My Project }

{Δημιουργήθηκε από  Doxygen 1.8.19}

\end{document}

我们得到:

在此处输入图片描述

我们看到这里第二行的一部分缺失了,我们预期:

在此处输入图片描述

这个结果是通过注释掉该行获得的:\renewcommand{\familydefault}{\sfdefault} 所以一个简单的解决方案是在生产代码中也这样做,但我很犹豫,因为这行是在 2013 年添加的,而且不知道为什么添加它(doxygen 当时还没有在 git 中,所以单独的提交也没有注册)。

为了提供一些附加信息,看起来同时还添加了以下几行:

\usepackage[T1]{fontenc}
\usepackage[scaled=.90]{helvet}
\usepackage{courier}
\usepackage{amssymb}
\usepackage{sectsty}
\renewcommand{\familydefault}{\sfdefault}
\allsectionsfont{%
  \fontseries{bc}\selectfont%
  \color{darkgray}%
}
  • 知道为什么\renewcommand{\familydefault}{\sfdefault}要添加这样一行吗?
  • 有什么建议可以改进这条线路\renewcommand{\familydefault}{\sfdefault},以便保留功能但副作用消失?

答案1

您似乎想要一个默认使用无衬线字体的文档:

\documentclass[twoside]{book}

\usepackage{fontspec}
\usepackage[greek]{babel}
%\usepackage{alphabeta} % why?
\setmainfont{Libertinus Sans}

\begin{document}

My Project

Δημιουργήθηκε από  Doxygen 1.8.19

\end{document}

使用您最喜欢的字体,只要它支持希腊语。

在您的代码中,您将衬线字体设置为 Libertinus Serif,但由于您未指定无衬线字体系列,因此重新定义\familydefault\sffamily选择默认值,即不支持希腊语的 Latin Modern Sans。

我认为没有alphabeta必要。

在此处输入图片描述

答案2

Computer Modern Unicode 字体是 Knuth 的 Computer Modern 的克隆,就像 Latin Modern 一样,包含希腊语。因此,您可以使用

\setmainfont{CMU Serif}
\setsansfont{CMU Sans Serif}
\setmonofont{CMU Typewriter Text}

解决此类错误的一个好方法是将其添加\tracinglostchars=2到文件顶部。然后 TeX 会告诉您所选字体是否不包含您正在使用的字符。默认情况下,它会默默地将警告消息记录到文件中.log

相关内容