不幸的是,该系列的下一个问题使用 \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
。