也许这个问题之前已经回答过了,但粗略搜索并没有发现任何东西。
命令如何接受参数是否有任何逻辑?例如,有些命令希望将命令的参数括在方括号中,\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}
其中键numlines
、placement
和overhang
具有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}