![为什么不同的命令有不同的语法?](https://linux22.com/image/275263/%E4%B8%BA%E4%BB%80%E4%B9%88%E4%B8%8D%E5%90%8C%E7%9A%84%E5%91%BD%E4%BB%A4%E6%9C%89%E4%B8%8D%E5%90%8C%E7%9A%84%E8%AF%AD%E6%B3%95%EF%BC%9F.png)
我理解 TeX 中命令的标准语法是
\name[optional-1]…[optional-n]{argument-1}…{argument-n}
然而,环境tabular
显然在必需参数之后采用其可选参数,而item
和hskip
/vskip
的参数在空格之后,并且没有以任何方式分组。
为什么不一致?还有其他类似tabular
、item
、a 和skip
's 的命令吗?
答案1
你最初的理解是错误的。[]
可选参数的约定是乳胶约定。LaTeX 的目标之一是为具有极不一致语法的 TeX 基元提供一致的命令界面。
对于基本类型:
\over
是 中缀 {a \over b}
因此 LaTeX 提供\frac{a}{b}
hskip
很奇怪,参数除了语法之外没有任何限制,\hskip 0pt plus 3pt xxx
LaTeX 提供了长度限制\hspace{0pt plus 3pt}xxx
但是最好避免将多个可选参数放在一起。如果命令是
\name[opt1][opt2]{main}
那么你不能提供第二个选项而不提供第一个选项,但如果语法是
\name[opt1]{main}[opt2]
两个可选参数都可以独立省略。
例如,请参阅\newcounter
或\newtheorem
具有多个选项。
这很快就会失控,因此大多数现代软件包如果想要更多选项,就会切换到 keyval 系统
\name[opt1=aaa,opt2=bbb]{main}
标准 LaTeX\newcommand
只允许定义一个可选参数,并且该参数必须是第一个参数,以避免此类问题。
答案2
恐怕你的假设是错误的。
TeX 没有括号中的可选参数的概念,而且其语法至少可以说是不标准化的。以下是 TeX 原语的一些示例:
\hbox
具有可选参数,用于指定框的宽度或框中的空间应分布多少;因此情况如下\hbox{<material>} \hbox to <dimen>{<material>} \hbox spread <dimen>{<material>}
参数
\hbox
、\vbox
、\vtop
和可以用 和 括起来;但\halign
对于、的参数,这不允许,其中左分隔符可以是,但右分隔符\valign
\bgroup
\egroup
\uppercase
\lowercase
\bgroup
有成为}
\vrule
具有指定宽度、高度和深度的可选参数;这些参数由关键字 、 和 引入,width
并且可以有任意数量,最后指定的参数获胜height
depth
\hskip
具有可选参数,用于指定可拉伸性和可收缩性,由关键字plus
和引入minus
;但plus <dimen>
如果存在, 必须位于minus <dimen>
规范之前。不允许有多个关键字实例。\over
适用于它出现的(子)公式中它前面和后面的所有内容,以前面的内容为分子,后面的内容为分母
除了最后一种情况(这是 Knuth 的错误决定)之外,指定参数的方式有其逻辑,尽管理解它需要对 TeXbook 有相当深入的了解。在某些情况下,参数由括号分隔,而在其他情况下则不是。这个想法是,原始命令不应该在文档中使用,因此它们的语法是特殊的,以提高效率。
Plain TeX 还支持非标准语法:
对于 27 的立方根,你必须说
$\root 3\of{27}$
的参数
\beginsection
是直到第一个空白行(或明确的\par
)的所有内容第一个参数
\proclaim
是第一个句点之前的内容,第二个参数是从句点到第一个空白行的所有内容
LaTeX 尝试建立尽可能统一的约定。例如,\makebox
有两个可选参数和一个强制参数;顺序为
\makebox[<dimen>][<alignment>]{<material>}
如果第一个可选参数不存在,则第二个可选参数没有意义。相反,它\newtheorem
有两个可选参数和两个强制参数:
\newtheorem{<envname>}[<counter>]{<name>}[<counter>]
在哪里只有一个可选参数可以出现。如果出现第一个,它告诉应该使用哪个计数器对 进行编号<envname>
;最后一个可选参数指定“父计数器”。这类似于 的语法\newcounter
:
\newcounter{<name>}[<counter>]
可选参数的存在意味着当新定义的计数器在其中步进和编号时应该重置;一个例子是\newcounter{subsection}[section]
。所以
\newtheorem{thm}{Theorem}[section]
\newtheorem{prop}[thm]{Proposition}
意味着thm
和prop
共享同一个计数器,该计数器在每次section
步进时都会重置,并具有表示<section number><thm number>
。
你提到\item
,它有一个可选参数和不强制参数;其后的文本不会\item
作为参数传递。环境遵循相同的约定,但参数遵循\begin{<env>}
;例如
\begin{tabular}[<alignment>]{<columns>}
与往常一样,在强制参数之前有可选参数。在 LaTeX 中,只有少数几个原语有其用途并在手册中记录;它们都不带参数(\par
、\hfil
、\hfill
和,\vfil
如果\vfill
我没记错的话)。