由于 `\ttfamily`,希腊语输出中缺少字符

由于 `\ttfamily`,希腊语输出中缺少字符

不幸的是,该系列的下一个问题使用 \usepackage[greek]{babel} 时以希腊文脚本设置的 ASCII 文本/由于 `\renewcommand{\familydefault}{\sfdefault}` 导致输出中缺少字符

当我们有如下 MWE 时:

\documentclass[twoside]{book}

\usepackage{fontspec}
\usepackage[greek]{babel}

\setmainfont{Libertinus Sans}

\begin{document}

00027         printf({"{}JUST A PRINT STATEMENT\(\backslash\)n"{}}); \par
00027         printf({"{}Just a print statement\(\backslash\)n"{}}); \par
00028         printf({"{}Λίστα Δοκιμαστικών\(\backslash\)n"{}}); \par

  \normalfont\ttfamily%
{00027         printf({"{}JUST A PRINT STATEMENT\(\backslash\)n"{}});}\par
{00027         printf({"{}Just a print statement\(\backslash\)n"{}});}\par
{00028         printf({"{}Λίστα Δοκιμαστικών\(\backslash\)n"{}});}\par
  \normalfont%
  \normalsize%

\end{document}

输出如下:

在此处输入图片描述

我们发现 Momospaced 部分缺少一些希腊字符,如何解决这个问题?

编辑 我采用了@Mico 的建议\setmonofont{Noto Mono}[Scale=MatchLowercase](实际上我复制了他的整个代码),但得到了一个奇怪的输出:

在此处输入图片描述

答案1

提供所需希腊字符的等宽字体是Noto Mono。肯定还有很多其他合适的等宽字体。

在此处输入图片描述

\documentclass[twoside]{book}
\usepackage{fontspec}
\usepackage[greek]{babel}
\setmainfont{Libertinus Sans}
\setmonofont{Noto Mono}[Scale=MatchLowercase]

\begin{document}
\obeylines % to avoid having to type all those \par directives...
00027         printf({"{}JUST A PRINT STATEMENT\(\backslash\)n"{}}); 
00027         printf({"{}Just a print statement\(\backslash\)n"{}}); 
00028         printf({"{}Λίστα Δοκιμαστικών\(\backslash\)n"{}}); 
\ttfamily
00027         printf({"{}JUST A PRINT STATEMENT\(\backslash\)n"{}});
00027         printf({"{}Just a print statement\(\backslash\)n"{}});
00028         printf({"{}Λίστα Δοκιμαστικών\(\backslash\)n"{}});
\end{document}

答案2

您需要声明一个支持希腊语的等宽字体。由于您的文档是无衬线字体,因此可以选择 DejaVu Sans Mono,它也包含在 TeX Live 中。由于等宽字体往往看起来比实际更大,因此我应用了一个比例因子;尝试直到找到正确的值,但要从远处看屏幕。

\documentclass[twoside]{book}

\usepackage{fontspec}
\usepackage[greek]{babel}

\setmainfont{Libertinus Sans}
\setmonofont{DejaVu Sans Mono}[Scale=0.8]

\begin{document}

00027         printf("JUST A PRINT STATEMENT\textbackslash n"); \par
00027         printf("Just a print statement\textbackslash n"); \par
00028         printf("Λίστα Δοκιμαστικών\textbackslash n"); \par

\begin{verbatim}
00027   printf("JUST A PRINT STATEMENT\n");
00027   printf("Just a print statement\n");
00028   printf("Λίστα Δοκιμαστικών\n");
\end{verbatim}

\end{document}

此外,与使用复杂的结构相比,verbatim对于此类物体来说更为方便。

在此处输入图片描述

答案3

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

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

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

相关内容