在某个环境中,比如
\newenvironment{whatever}[3]{...}{...}
你可以通过以下方式实例化它(如果这是 LaTeX 中的意思)
\begin{whatever}{first}{second}{third}
...
\end{whatever}
但是你如何定义一个环境,以便通过以下方式实例化它:
\begin{whatever}[some_optional]{first}{second}{third}
...
\end{whatever}
我说的不是参数的默认值first
,second
或third
,而是一个完全可选的参数,例如
\begin{figure}[htb]
... ^--- THIS!
\end{figure}
答案1
\newenvironment{whatever}[4][??]
{...}
{...}
\begin{whatever}{one}{two}{three}
is #1= {??}
#2= one
#3= two
#4= three
\begin{whatever}[zero]{one}{two}{three}
is #1= zero
#2= one
#3= two
#4= three
\newenvironment{whatever}[4][foo]
{...}
{...}
\begin{whatever}{one}{two}{three}
is #1= foo % preset to foo, if missing
#2= one
#3= two
#4= three
\begin{whatever}[bar]{one}{two}{three}
is #1= bar % the optional argument
#2= one
#3= two
#4= three
答案2
这xparse
包裹提供一个简单的用户界面来指定环境的可选参数(以各种顺序),包括命令/宏。为此,您可以使用 定义环境\NewDocumentEnvironment
,而常规宏使用\NewDocumentCommand
。前者具有以下语法:
\NewDocumentEnvironment{<env>}{<arg spec>}{<beg env>}{<end env>}
<env>
,<beg env>
并<end env>
以传统方式定义使用(或)时<env>
执行代码的环境,并使用(或)时执行代码。包含一系列参数规范到环境,可以根据需要混合可选参数和强制参数。简而言之,这就是它们的指定方式(省略一些选项;有关更多详细信息,请阅读<beg env>
\begin{<env>}
\<env>
<end env>
\end{<env>}
\end<env>
<arg spec>
xparse
包装文档):
m
- A强制的参数(需要{ }
)o
- 一个选修的参数(用途[ ]
)O{<default>}
- 一个选修的类似于参数,但如果未给出参数则o
返回(使用)<default>
[ ]
d<token1><token2>
- 一个选修的带有特殊分隔符的参数(使用<token1> <token2>
)D<token1><token2>{<default>}
- 一个选修的类似于参数,但如果未给出参数则d
返回(使用)<default>
<token1> <token2>
这里有些例子:
\documentclass{article}
\usepackage{xparse}% http://ctan.org/pkg/xparse
\begin{document}
\NewDocumentEnvironment{whatever}{m o O{foobar} m}{}{}
\NewDocumentEnvironment{whomever}{O{yes} D(){no}}{}{}
% #1=foo; #2=\NoValue; #3=foobar; #4=bar
\begin{whatever}{foo}{bar} foo \end{whatever}
% #1=foo; #2=bar; #3=foobar; #4=bar
\begin{whatever}{foo}[bar]{bar} foo \end{whatever}
% #1=yes; #2=no
\begin{whomever} foo \end{whomever}
% #1=no; #2=yes
\begin{whomever}[no](yes) foo \end{whomever}
\end{document}
显而易见的是,这个接口将现有的“单个可选参数”规范扩展到了更广泛的范围。