我知道这样编写 latex 不是一个好习惯,但只是想知道为什么\textbf\&
与 相同\textbf{\&}
,而 却\textbf\"o
与 不一样\textbf{\"o}
?
答案1
其他人已经回答了你的大部分问题,所以我将限制为什么你没有得到错误
\textbf\"o
值得去
\textbf{hmmmm}
{\tracingmacros2 aaa \textbf\"o bbb}
第一个是在打开跟踪之前确保设置了粗体字体,第二个是在打开跟踪设置后,查看日志文件,您将看到宏扩展:
在检查了要使用哪种字体设置来获取重音(默认情况下为 OT1)之后,TeX 最终得到:
\OT1\" #1->\@text@composite \OT1\" #1\@empty \@text@composite {\add@accent {127}{#1}}
#1<-\check@icr
因此,的参数\"
是\check@icr
LaTeX 添加到所有命令末尾的标记,\text__
以检查以下文本的斜体斜率,看是否需要斜体校正。
因此,为什么这不会产生错误的答案基本上只是运气(或者运气不好,取决于你的观点)\"
没有得到错误,因为它有一个参数,即使不是你想要的那个,并且\check@icr
因为它被设计为向前看,无论之后发生什么,它\textbf
都是相当防御性的,并且通常避免犯错误,如果它没有找到什么,它就不会插入斜体更正,所以即使它在完全错误的地方被扩展,在重音命令里面它只是决定不插入斜体更正并且事情继续进行......
答案2
\&
是一个标记,而\"o
是两个标记。如果您不使用括号来分隔参数,\textbf
则只会影响它找到的下一个标记。
答案3
扩展 Gonzalo 的正确答案。
TeX 操作 token 时,会逐个扫描它们(在正常操作中)。有\textbf\"o
三个 token
\textbf \" o
TeX 的语法规则规定,当命令带有参数( 的情况就是如此\textbf
)时,该参数的确定方式如下:
- 如果下一个标记是不是一个左括号
{
,该标记是参数 - 如果下一个标记是一个开括号,
{
则参数就是从上到下与其平衡的所有{
内容}
。
因此,\textbf\&
参数为\&
;\textbf\"o
参数为\"
。这两个调用分别相当于\textbf{\&}
和\textbf{\"}o
。
另一方面,在\textbf{\"{o}}
论点中是\"{o}
(因为内部括号相互平衡)。
始终对带有参数的命令使用括号(除非您属于应该知道自己在做什么的忍者程序员类别),这样就没问题了。
答案4
\&
在 LaTeX 中是特殊用途的。如果你使用\textbf
它,它将只标记 1 个字符。所以不要这样使用。使用\textbf{text}