如何编写具有条件结构和一个可选参数的 \newenvironment

如何编写具有条件结构和一个可选参数的 \newenvironment

我想定义一个带有可选参数的新环境。目前,我有

\theoremstyle{plain}
\newtheorem{prop}{Proposition}
\newenvironment{propExt}[1][]{\ifx!#1! \begin{prop} 
\else \begin{prop}(Proof in \ref{#1})} 
{\end{prop}}

当我添加可选参数时,一切正常,例如

\begin{propExt}[label_name]

但是,没有任何参数,\begin{propExt}我收到错误消息

! Incomplete \ifx; all text was ignored after line 283.

我认为问题在于,\end{prop}如果没有指定参数,则不会执行,如下所示\else

我应该怎么做?

答案1

这是因为该语句没有结束子句\ifx;它的结构为\ifx...[ \else]... \fi。实现您所追求的目标的一种简单方法是:

\theoremstyle{plain}
\newtheorem{prop}{Proposition}
\newenvironment{propExt}[1][\empty]
  {\begin{prop}% Start prop
   \ifx\empty#1\relax\else(Proof in~\ref{#1})\fi}% Conditionally add (Proof in~\ref{#1})
  {\end{prop}}% End prop

这将检查提供的可选参数是否匹配\empty(无论是否已定义)。还有其他方法可以执行这些检查。最值得注意的是使用xparse

\usepackage{xparse}% http://ctan.org/pkg/xparse
\theoremstyle{plain}
\newtheorem{prop}{Proposition}
\NewDocumentEnvironment{propExt}{o}
  {\begin{prop}% Start prop
   \IfNoValueTF{#1}{(Proof in~\ref{#1})}{}}% Conditionally add (Proof in~\ref{#1}
  {\end{prop}}

xparse提供条件\IfNoValueTF{<arg>}{<true>}{<false>},其中您可以确定是否为某个值提供了条件<arg>(在上述情况下为单个可选参数)。 更简单的方法(如果没有错误的子句(是必需的)是使用\IfValueT{#1}{(Proof in~\ref{#1})}

相关内容