函数参数语法的韵律和理由(方括号与大括号)

函数参数语法的韵律和理由(方括号与大括号)

我想获得一些关于函数参数中括号和大括号的选择的直觉。例如[...yadda...]{...yadda...}

我是 LaTeX 的老用户,但对基础知识了解甚少。每当我尝试猜测/回忆一个旧函数时,我似乎总是搞不清楚它应该是: \somefunction{argument1}[argument2] 还是类似的东西 \somefunction{argument}{argument}

这真的是临时性的吗?赫伯特这里或者这些模式至少存在一些逻辑性的特征?

编辑:感谢大家的清晰回复。我发现讨论这里也非常有帮助。我特别感谢以下链接 TeX 按主题分类 作者:Victor Eijkhout。

答案1

您说得对,记住哪个是哪个1并不总是那么容易。这背后没有真正的原因——只是可选参数是惯例,并且——现在已经成为一条不成文的规则——由方括号组成。因此,如果您知道参数是可选的,那么在 99% 的情况下,您可以安全地使用方括号。它也是第一个参数,因为提前查看是否存在可选参数是有意义的。

有时环境类型的命令会引起混淆,例如:

  \begin{figure}[htbp]

这里要使用的助记符是

  \figure[htbp]

[]这再次遵循代表可选参数的规则。

texdoc package name对于一些复杂的模式(例如wrapfig包命令等),需要耐心和耐心,最后可以使用以下命令:

  \begin{wrapfigure}[6]{r}[..]{12cm}

但即使如此,这里的模式仍然是这样的[optional]{argument}

花括号约定起源于早期的计算机语言,当时它们被用来表示开始结尾在 Pascal 中,这是 Knuth 用来编写 TeX 的语言,花括号表示函数定义的参数,对于 TeX 使用相同的方法可能更有意义。

最初的 TeX 并没有我们今天所熟知的内置可选参数机制。宏的定义方式如下:

  \def\name#1#2{#1 #2}

使用花括号表示参数调用也是有意义的,因为你实际上告诉解析器,开始读取此参数直到遇到结尾。有人可能会认为使用普通括号会更好,并且如果写成如下形式,像上面这样的宏将遵循更现代的范式:

\name(...)(...)

事实上,以这种方式编写 TeX 宏来接受输入非常容易。但是,如果您考虑到我们主要处理的是文本输入,那么普通括号在此类文本中很常见,这将迫使我们开始使用引号或其他约定来划分字符串。

LaTeX 团队构建了更复杂的顶级函数以使生活变得更轻松,特别是自从引入键值概念以来,更加标准化的语法样式成为可能。

但总的来说,我同意你的观点,即总体而言(所有)TeX 不会占用大量的计算机内存,但它确实会给我们自己的计算机内存带来负担。

  1. 我对 markdown 的链接也有同样的问题。

答案2

这实际上是@Yiannis 回答的附言,但关于参数可选的规则[]并不是不成文的,在 LaTeX 书中明确指出那是 LaTeX 语法。

使用原始\def工具可以定义基本上具有任意语法的命令,但是在所有核心 LaTeX 发行版和大多数贡献包中定义的命令都遵循这些规则。

有三种参数类型(用于环境和命令)

强制参数用 括起来{}。此类参数的数量对于特定命令始终是固定的。(因此,强制参数的数量永远不会取决于可选参数的值。)

可选参数被包围,[]可能有任意数量的可选参数。由于它们是按位置确定的,因此通常不会有超过 2 或 3 个。为了避免需要有太多的可选参数,在较新的软件包中(但在基本 latex 发行版中永远不会)通常在\includegraphics[width=3cm,clip]{...}命令graphicx版本中的单个可选参数中使用 key=value 语法。

图片模式参数以图片模式单位表示坐标或大小,并被()例如\makebox(10,10){...}

此外,还有*-form,它被记录为不同的命令(如在环境中),但对于命令来说,从技术上讲,它是一个特殊参数,可以被认为是布尔标志(星号或非星号)。因此,tabulartabular*环境是两个具有不同名称的独立环境,而\section\section*,虽然以类似的方式记录,但从技术上讲,它们是单个命令\section,它采用特殊的可选*标志(在这种情况下,它确定该部分是否编号)。

相关内容