这是一个非常基本的问题。但是我没有找到简单的规则,所以我在这里问了。
一些 LaTeX 命令(如\noindent
)会影响整个段落。其中一些命令(如\emph
)会影响其参数(\emph{Text goes here}
),而另一些命令(如\color
)会影响段落的剩余部分(除非它们被放入 中{}
)。
我不知道如何区分这些情况。
答案1
控制\noindent
序列不是宏,而是基元。它不是对整个段落都有效的。它指示 TeX 离开(内部)垂直模式并进入水平模式。(我在一篇博客中描述了 TeX 的垂直和水平模式邮政。
与您的问题更相关的是,没有很好的方法来区分哪些控制序列有参数。LaTeX 3 团队已经付出了一些努力来提供一致的命名约定,让用户知道需要多少个参数以及什么类型。请参阅expl3
文档了解详情。
更复杂的是,许多 LaTeX 宏严格来说不接受任何参数,但实际上却接受。例如,根据 TeX,宏\emph
不接受任何参数。为了了解这一点,我们可以让 TeX 使用原语显示宏的实现\show
:
*\show\emph
> \emph=macro:
->\protect \emph .
<*> \show\emph
乍一看,这有点难以理解,但在第一行,我要求 TeX 显示 的定义\emph
(这*
是 TeX 的提示符)。TeX 回应说,这\emph
是一个不带参数的宏,扩展为\protect \emph
。(后一个控制序列的名称中实际上有一个空格,这就是为什么二\emph
和句号之间的空格。)
作为接受参数的宏的示例,我们可以定义\def\foo#1{asdf}
接受单个参数的宏。当我们向 TeX 请求定义时,它会做出如下响应。
*\show\foo
> \foo=macro:
#1->asdf.
<*> \show\foo
这里,它向我们展示了它接受一个参数(表示为#1
),然后扩展为asdf
(请注意,我们实际上并没有使用该参数)。
这意味着我们甚至无法询问 TeX 哪些宏需要参数,哪些不需要。(从技术上讲,确定给定宏是否需要参数的问题是不可判定的。证明可以简单地归结为停机问题。
不幸的是,这意味着区分需要参数的控制序列、一直有效直到未来某个时间点(例如一个组的末尾或一个段落的末尾)的控制序列和立即执行某些离散操作的控制序列只是一个经验和阅读文档的问题。希望 LaTeX 3 能改善这种情况。
答案2
你的问题提出了三个问题。首先是简单的问题arguments
。当你说 \emph{text goes here} 时,你正在调用一个已用一个参数定义的宏,可能是这样的:
\def\emph#1{\textit{#1}}
在这种情况下,大多数宏只会影响封闭的文本。
当您收到诸如\noindent
\small
等命令时,它们通常会继续,直到再次重新定义。这只是一个惯例,命令不需要以这种方式定义。这是从 Knuth 开始的惯例。可以将它们视为globals
其他编程语言或cascading
CSS 中的惯例。
当您使用{}
或grouping
限定命令的范围时。分组机制可以被认为有点像其他编程语言中的范围,但在 TeX 中,该机制要强大得多。除非另有明确说明,否则组内进行的大多数分配都是该组的本地分配,而在组外,旧值将被恢复(与 Pascal 非常相似)。如果我们输入以下示例:
\def\anumber{42}
\anumber % -> 42
{
\def\anumber{43}
\def\b{2}
\anumber % -> 43
}
\anumber % -> 42
宏anumber
在组内和组外的值会有所不同。有很多命令与分组和区分局部和全局定义有关。