
我知道有多種方法可以解決此問題(例如\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
的編碼。cmr10
因此在OT
預設定義中使用(使用數學字體)。\ttfamily
更改系列但不更改編碼,因此在這種情況下,即使cmtt
字體實際上編碼不同,您也會獲得 OT1 定義。
效果更好,T1
因為標記為 T1 編碼的字體實際上具有相同的編碼。
\_
有所不同,因為\textunderscore
有一個預設定義,完全不使用字體,而是使用水平線。