举个愚蠢的例子,以下用户定义环境根据可选参数 启动itemize
环境或环境。但如果参数变量不能在环境的结束定义中引用,那么如何指定它是要结束的还是要结束的? enumerate
itemize
enumerate
\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
“结束部分”中也可以使用参数。