我可以用反斜杠转义一些特殊字符。
\documentclass{article}
\begin{document}
\# \$ \% \& \_ \{ \}
\end{document}
但是为什么我不能只用反斜杠^
来转义~
?例如,下面的代码不起作用。
\documentclass{article}
\begin{document}
\^
\end{document}
这会导致 texlive 出现以下错误。
$ pdflatex foo.tex
This is pdfTeX, Version 3.14159265-2.6-1.40.15 (TeX Live 2015/dev/Debian) (preloaded format=pdflatex)
restricted \write18 enabled.
entering extended mode
(./foo.tex
LaTeX2e <2014/05/01>
Babel <3.9l> and hyphenation patterns for 2 languages loaded.
(/usr/share/texlive/texmf-dist/tex/latex/base/article.cls
Document Class: article 2014/09/29 v1.4h Standard LaTeX document class
(/usr/share/texlive/texmf-dist/tex/latex/base/size10.clo)) (./foo.aux)
! Missing \endcsname inserted.
<to be read again>
\global
l.4 \end
{document}
?
! Emergency stop.
<to be read again>
\global
l.4 \end
{document}
! ==> Fatal error occurred, no output PDF file produced!
Transcript written on foo.log.
事实上,我必须先用反斜杠转义它们,然后再添加{}
后缀才能使其正常工作。
\documentclass{article}
\begin{document}
\^{}
\~{}
\end{document}
我理解{}
,即空的参数列表会强制 TeX 再次将其视为命令的结束和文本的开始,但我想了解为什么{}
有必要。
两个问题:
- 这些字符为什么不能
\
单独逃脱? \^{}
和之间有什么区别吗\^\
?它们似乎给出相同的输出,但我想知道它们之间是否存在任何差异,在任何情况下都可能产生不同的结果?
答案1
虽然我们通常说这\
是转义字符,但它实际上是 TeX 用来引入控制序列. 控制序列有两种类型。控制字\
由加一串字母组成。控制符号\
由加上一个非字母组成。
但无论哪种情况,都不是\
逃避本身。您认为“转义”的每个字符实际上都是控制符号,它们都有实际定义。有些只是扩展为相应的字符,但有些则没有。以下是它们的实际定义:
*\show\#
> \#=\char"23.
*\show\$
> \$=\char"24.
*\show\%
> \%=\char"25.
*\show\&
> \&=\char"26.
*\show\{
> \{=macro:
->\delimiter "4266308 .
*\show\}
> \}=macro:
->\delimiter "5267309 .
*\show\^
> \^=macro:
#1->{\accent 94 #1}.
*\show\'
> \'=macro:
#1->{\accent 19 #1}.
*\show\~
> \~=macro:
#1->{\accent "7E #1}.
\^
请注意,在、\~
和的情况下,\'
宏定义采用参数。因此,它们将把下一个字符作为该参数。如果您不希望发生这种情况,则需要使用 明确停止它{}
。
回答你的第二个问题,\^{}
与 并不相同,\^\
因为后者会插入空格,而前者不会。例如:
\^\ foo \^{}foo
将产生以下输出:
答案2
艾伦已经解释了为什么\^
采用一个参数,但也请注意,latex 具有\textbackslash
,\textasciicircum
和\textasciitilde
生成\ ^ ~
在原始 OT1 编码的情况下\textasciicircum
,并且 \textasciitilde
实际上与\^{}
和相同\~{}
,即在空基上放置一个重音符,并从数学符号字体中\backslash
获取\
,因为 OT1 编码不包含这些字符。
然而如果你使用 T1 (或者任何有\
、^
和~
字符的正常编码) 那么\textasciicircum
和\textasciitilde
将在那些位置上使用字体中的字符, 这些字符通常比重音符号更大更低, 并且\backslash
将使用\
当前字体中的 。