为什么某些字体命令的行为不同?

为什么某些字体命令的行为不同?

我一直对字体命令行为的差异感到困惑。

例如,我们有\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>}(简化)。

相关内容