我一直对字体命令行为的差异感到困惑。
例如,我们有\mathrm{}
和\texttt{}
,可以像这样使用:\texttt{hello} world
。
然后我们有\it
和,\bf
必须用作{\it hello} world
。如果使用\it{hello} world
,则两个词都用斜体表示。
从内部来看,这里有什么不同?这种差异是经过深思熟虑的设计决定吗?如果是,原因何在?
答案1
原始字体命令(您在示例中未显示任何命令)的工作方式与\bf
当前组其余部分的所有文本一样,并会影响这些文本,因此通常的语法是{\it hello\/}
虽然不需要外部组,但您可以\it hello\/ \rm world
不进行分组。
该语法很高效,但有些违反直觉,但在纯 TeX 和 LaTeX2.09 中,所有字体命令都是这样的。LaTeX2e 引入并鼓励\textit
使用参数语法并自动处理斜体校正的形式\/
。它们实际上是声明形式的简单包装器,例如\itshape
。在纯文本和 LaTex2.09 中定义的旧“2 个字母”名称\bf
在 latex2e 格式中根本没有定义,但许多类包含一个兼容性包,为旧的(即 1993 年之前)文档片段定义它们。\bf
然后定义为或多或少\normalfont\bfseries
。
答案2
你让人困惑开关和宏。虽然前者仍然是一个宏(在 TeX 意义上),但它不接受争论. 因此(我使用的是包含在\textit
我使用或\it
、\bfseries
或\bf
等有关系吗), 使用
\itshape{hello} world
在它使用的组内产生\itshape
跨度,并且那里没有跨度。然而,
{\itshape hello} world
防止转变 \itshape
跨越它所用组之外。\texttt
(和朋友)接受一个参数,然后将其放在一个组内。您可以.log
在编译以下 MWE 后通过查看文件来看到这一点:
\documentclass{article}
\def\pshow#1{{\let\protect\show #1}}% https://tex.stackexchange.com/q/117169/5764
\begin{document}
\pshow\texttt
test
\end{document}
演出.log
\texttt =\long macro:
#1->\ifmmode \nfss@text {\ttfamily #1}\else \hmode@bgroup \text@command {#1}
\ttfamily \check@icl #1\check@icr \expandafter \egroup \fi .
您可以清楚地看到\texttt{<stuff>}
转换为分组{\ttfamily <stuff>}
(简化)。