命令参数:[...] vs {...}

命令参数:[...] vs {...}

也许这个问题之前已经回答过了,但粗略搜索并没有发现任何东西。

命令如何接受参数是否有任何逻辑?例如,有些命令希望将命令的参数括在方括号中,\begin{figure}[h!]...但其他命令希望将参数括在花括号中\begin{multicolor}{2}...。我经常犯这个错误,不得不回去查找它们,或者参考旧文档。有没有办法了解哪种类型的参数通常包含什么?或者我只是必须知道(或者更现实地说,将一大堆更多的片段放入 sublime?)

答案1

为了回答您的问题,我们可以戴不同种类的眼镜。

标准眼镜

LaTeX 的标准行为非常简单:

  • []用于可选参数,
  • {}用于强制参数。

“可选参数”这个名称意味着您不需要使用它。即使没有它,命令仍会起作用。

一个简单的例子是,命令\section有一个强制参数和一个可选参数。这意味着\section{title}有效和\section[title in toc]{title}无效。

但是,有几个命令也使用 来()作为其强制参数。通常圆括号用于坐标。该命令\put 需要一个坐标对,必须通过 传递()。图形包如蒂克兹或者技巧照着做。

然而每个作者都可以自由选择括号。

xparse眼镜

相对较新的前端包expl3允许每个用户以非常简单的方式设置强制和可选参数的括号。这可能导致各种命令没有明确的语法。通常所有作者都使用上面解释的方法。

答案2

这些分隔符的用法可能有所不同*,但它们主要用于指定可选参数[..]和强制{..}参数。可选参数意味着您可以省略它们而不会失去功能,而强制参数意味着它们是成功编译项目所必需的。

以前,仅使用不同宏参数的参数意味着用户可以创建,例如,

\newcommand{\mymacro}[9]{%
  % Do something with #1, ..., #9
}

最终用户无法明确知道参数的含义#5(比如说)。因此,您必须不断返回文档并阅读参数类型(可选或强制)以及参数的位置。这种情况今天仍然会发生。例如,考虑wrapfig包裹wrapfigure环境。从wrapfig文档你有

在此处输入图片描述

虽然我很喜欢这个套装,但是总是必须返回文档来弄清楚什么放在哪里以及为什么。还存在其他用例,如果您忘记了,就必须返回并弄清楚。这就是现实。

如果你不确定类型参数,您可以\show\mymacro在文档中使用 quick 并查看宏的构造。当然,这只在某些情况下有效,因为使用\newcommand带有可选参数的定义在使用时不会提供太多价值\show。以下是一些示例:

在此处输入图片描述

\documentclass{article}
\newcommand{\mymacroA}[2][0]{Do stuff}
\def\mymacroB#1{Do stuff}
\makeatletter
\def\mymacroC{\@ifnextchar[\@mymacroC{\@mymacroC[0]}}
\def\@mymacroC[#1]#2{Do stuff}
\makeatother
\begin{document}
\ttfamily
\meaning\mymacroA \par
\meaning\mymacroB \par
\meaning\mymacroC
\end{document}

在上面的例子中,\mymacroA\mymacroC提供了可选的参数/接口,因此可以用作\mymacro[<optarg>]{<manarg>}或只是\mymacro{<manarg>}。从宏的含义来看,它们需要它并不那么明显,但确实需要。

为了培养良好的实践,使用键值始终是一种传递参数的简洁方法,这些参数可以接受不同的输入。使用wrapfig上面的例子,像下面这样的界面可能会更直观:

\begin{wrapfigure}[numlines=12,placement=r,overhang=34pt,width=5cm]
  %<figure>
\end{wrapfigure}

其中键numlinesplacementoverhang具有width一些预定义的默认值。

*xparse包裹提供了非常容易调整分隔符类型的方法。此外,使用基本的 TeX 命令,您还可以创建自己的参数文本组合,这些组合可以被视为可选的或强制的,使用\@ifnextchar命令组合,如上面的 MWE 中所示。

答案3

括号{}用于在内部引入参数。使用您的示例:

\begin{figure}

\end{figure}

[]用于传递选项:

\begin{figure}[t] %command: begin.  argument: figure.  option: top
\includegraphics[width=100mm]{filename} %command: includegraphics. argument: filename.  option: width=100mm.
\end{figure} 

相关内容