您如何定义您的环境,例如使用 [...] 作为某些参数?

您如何定义您的环境,例如使用 [...] 作为某些参数?

在某个环境中,比如

\newenvironment{whatever}[3]{...}{...}

你可以通过以下方式实例化它(如果这是 LaTeX 中的意思)

\begin{whatever}{first}{second}{third}
   ...
\end{whatever}

但是你如何定义一个环境,以便通过以下方式实例化它:

\begin{whatever}[some_optional]{first}{second}{third}
   ...
\end{whatever}

我说的不是参数的默认值firstsecondthird,而是一个完全可选的参数,例如

\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}

显而易见的是,这个接口将现有的“单个可选参数”规范扩展到了更广泛的范围。

相关内容