![如何编写具有条件结构和一个可选参数的 \newenvironment](https://linux22.com/image/268780/%E5%A6%82%E4%BD%95%E7%BC%96%E5%86%99%E5%85%B7%E6%9C%89%E6%9D%A1%E4%BB%B6%E7%BB%93%E6%9E%84%E5%92%8C%E4%B8%80%E4%B8%AA%E5%8F%AF%E9%80%89%E5%8F%82%E6%95%B0%E7%9A%84%20%5Cnewenvironment.png)
我想定义一个带有可选参数的新环境。目前,我有
\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})}
。