我刚刚渲染了以下内容:
\documentclass[varwidth=true, border=2pt]{standalone}
\begin{document}$\textbackslash$
\end{document}
似乎给出的结果与 相同$n$
。你知道为什么吗?\textbackslash
对于文本模式而不是数学模式,我预计 TeX 在这种情况下会失败。相反,我得到的是
LaTeX 警告:命令 \textbackslash 在数学模式下无效
那么为什么\textasciitilde
数学模式会导致 LaTeX 崩溃而其他模式则\textbackslash
不会呢?
答案1
\textbackslash
OT1 编码的使用定义是
\OMS-cmd \textbackslash \OMS\textbackslash
第一个和第三个标记都不能由用户输入,除非使用一些狡猾的技巧。但是,的定义\OMS-cmd
相当于
\def\OMS-cmd#1#2{%
\ifx\protect\@typeset@protect
\@inmathwarn #1%
\expandafter\ifx\csname\cf@encoding\string#1\endcsname\relax
...<omitted irrelevant things>...
}
该宏\@inmathwarn
负责警告
Command \textbackslash invalid in math mode
之后,宏\OMS\textbackslash
被展开。如果我们处于文本模式,该命令将在一个组中执行字体更改,在 OMS 编码(数学符号)中选择一种字体,执行
\char"6E
并且会出现一个反斜杠,因为这是 OMS 编码字体在插槽"6E
(十六进制)中所具有的。
如果我们处于数学模式,\char"6E
则会执行相同的指令,但此时字体更改不起作用。因此,我们获取了位于"6E
数学系列 0 中的字体中位置的字符,其中n
找到了 。当\char"6E
在数学模式下找到 时,TeX 会将其视为 ,并且\mathchar"006E
在系列 0 中,插槽"6E
中有一个n
(它是直立文本字体,并且 的 ASCII 码n
恰好是"6E
)。
在 T1 编码中情况有所不同,因为在这种情况下的定义\textbackslash
是
\T1-cmd \textbackslash \T1\textbackslash
后一个宏最终扩展为\char"5C
。在文本字体、T1 编码中,在 slot 处"5C
实际上有一个反斜杠。
以下是解释。现在,给出一些建议:
永远不要低估警告和
切勿
\text...
在数学模式下使用符号命令(不要将它们与 或类似的命令混淆\textrm
,\textit
它们在数学模式下显然是合法的)。
答案2
正如 Ulrike 的回答中提到的那样在 alltt 环境中电传打字 \textbackslash,当使用 OT1 编码时, 的字形\textbackslash
是从符号字体中获取的(因为常规字体中没有它的字形)。如果您运行我的 MWE 并放大图中所示的列('6 或 ''E 列),您将看到符号字体(cmsy10)反斜杠字符位于插槽 110 中,这恰好与n
斜体字体(cmti10)中的字母位于同一插槽中。据推测,在数学模式下,使用的字体被重定向到斜体字体,因此,在符号字体中\char110
呈现为,而在数学字体中呈现为斜体。\textbackslash
n
可以使用 T1 编码 ( ) 来规避此问题\usepackage[T1]{fontenc}
,该编码在常规字体中提供文本反斜杠。即使在数学模式下,它也能正确呈现。
\documentclass{article}
\usepackage{fullpage}
%\usepackage[T1]{fontenc}
\usepackage{fonttable}
\begin{document}
\fonttable{cmti10}
\fonttable{cmsy10}
\end{document}