如何结束具有条件启动定义的用户定义环境?

如何结束具有条件启动定义的用户定义环境?

举个愚蠢的例子,以下用户定义环境根据可选参数 启动itemize环境或环境。但如果参数变量不能在环境的结束定义中引用,那么如何指定它是要结束的还是要结束的? enumerateitemizeenumerate

\documentclass{article}

\usepackage{ifthen}

\newenvironment{selectlist}[1]{%
   \ifthenelse{\equal{#1}{itemize}}
      {\begin{itemize}}
      {\begin{enumerate}}
}
      {\end{???????????}}  %This is the question

\begin{document}

\begin{selectlist}{itemize}  
   \item Hello world!   %itemized
\end{selectlist}

\begin{selectlist}{enumerate}
   \item Hello world!   %enumerated
\end{selectlist}   

\end{document}

答案1

不要打开环境,而是使用 true/false 参数来定义宏:

\documentclass{article}

\usepackage{ifthen}

\newenvironment{selectlist}[1]
 {%
  \ifthenelse{\equal{#1}{itemize}}
    {\def\selectedlist{itemize}}
    {\def\selectedlist{enumerate}}%
  \begin{\selectedlist}%
 }
 {\end{\selectedlist}}

\begin{document}

\begin{selectlist}{itemize}
   \item Hello world!   %itemized
\end{selectlist}

\begin{selectlist}{enumerate}
   \item Hello world!   %enumerated
\end{selectlist}

\end{document}

在此处输入图片描述

当然\ifthenelse是多余的:

\newenvironment{selectlist}[1]
  {\def\selectedlist{#1}\begin{\selectedlist}}
  {\end{\selectedlist}}

会做同样的事情。有了xparse它就更容易了:

\usepackage{xparse}
\NewDocumentEnvironment{selectlist}{m}
 {\begin{#1}}
 {\end{#1}}

因为在\NewDocumentEnvironment“结束部分”中也可以使用参数。

相关内容