我知道有很多方法可以解决这个问题(例如\usepackage[T1]{fontenc}
),但我想了解以下例子中发生的情况。
\documentclass{article}
\begin{document}
\noindent
\$ \% \& \{ \} \_ \# \textbackslash \\
\ttfamily \$ \% \& \{ \} \_ \# \textbackslash \\
\verb+$ % & { } _ # \ +
\end{document}
为什么尝试获取
\ttfamily
括号、下划线或反斜杠会导致替换普通罗马符号?字形显然没有丢失,因为逐字模式可以访问它们。逐字模式究竟如何访问这些字形?
删除括号和反斜杠,这样下划线就成为唯一剩下的“问题”字符,尽管替换仍在进行,但字体警告已消失。这是为什么?
答案1
\verb
并verbatim
假设字体在其 ascii 位置上有这些字符,并且在本地使这些字符成为 catcode 12(如标点符号),没有特殊定义。
\textbackslash
(和朋友)被定义为特定于编码的命令,并且(为了假装对原始 TeX 编码保持理智)LaTeX 假设编码是没有反斜杠字符OT1
的编码。因此在默认定义中使用(使用数学字体)。更改系列但不更改编码,因此在这种情况下,即使字体的编码方式不同,您也会获得 OT1 定义。cmr10
OT
\ttfamily
cmtt
事情进展得更好,T1
因为标记为 T1 编码的字体实际上具有相同的编码。
\_
是不同的,因为它\textunderscore
有一个默认定义,它根本不使用字体,而是使用水平规则。