公平警告:我对字体和字体编码几乎一无所知,所以这也许是我的另一个幼稚问题。
最近,我问关于的行为\detokenize{_}
,因为需要指定\usepackage[T1]{fontenc}
它才能按预期工作。
_
显然,LaTeX 的默认字体编码是 OT1,而OT1 中没有。因此,要将\detokenize{_}
或之类的内容\string_
渲染为_
而不是˙
,必须指定 T1 字体编码。
然而,正如 @egreg 在对该问题的评论中指出的那样并且我们都知道,\_
渲染方式与_
LaTeX 一样,无需对字体编码进行任何处理。
所以,我的问题是 LaTeX 实际上如何呈现,\_
就好像OT1(默认编码)中_
没有一样?_
答案1
plain.tex
包括
\def\_{\leavevmode \kern.06em \vbox{\hrule width.3em}}
latex.ltx
包括
\DeclareTextCommandDefault{\textunderscore}{%
\leavevmode \kern.06em\vbox{\hrule\@width.3em}}
和
\DeclareRobustCommand{\_}{%
\ifmmode\nfss@text{\textunderscore}\else\textunderscore\fi}
但t1enc.def
包括
\DeclareTextSymbol{\textunderscore}{T1}{95}
因此,如果加载了 T1,则使用字体中的实际下划线。在这种情况下,from\DeclareTextSymbol
会覆盖fromt1enc.def
的默认含义,因此也会覆盖 的默认含义。当然,如果未加载 T1 并使用 OT1,则不会覆盖默认定义,并且 TeX 在排版或时本质上会伪造下划线。\textunderscore
latex.ltx
\_
\textunderscore
\_