我想在另一个环境中定义一个环境,但我需要确保新环境是唯一的,因此只能有一个。环境unique
还应该能够是外部环境的任何点。因此代码将类似于:
\begin{myenv}
\begin{env} ... \end{env}
\begin{env} ... \end{env}
\begin{unique-env}
there can be no other environments of this type in myenv
\end{unique-env}
\begin{env} ... \end{env}
\end{myenv}
我已经找到了如何检查unique
环境是否存在的myenv
方法,但不知道如何确保它是唯一的此类环境。
我会尝试澄清一下。我需要这合法:
\begin{some_env}
\begin{unique-env}
Something
\end{unique-env}
\end{some_env}
这是违法的:
\begin{some_env}
\begin{unique-env}
Something
\end{unique-env}
\begin{unique-env}
Something
\end{unique-env}
\end{some_env}
其中some_env也是我定义的东西。
我需要的独特之处不一定是环境,也可以是命令
\begin{some_env}
\uniquesCommand{Something}
\end{some_env}
答案1
可以使用在环境启动代码中检查的新计数器。如果计数器等于零,则一切正常,增加计数器以指示计数器不再为零,如果计数器从一开始就不为零(因为它已经增加),则发出错误消息。
在环境结束时,计数器将重置为零。
计数器的优点是它是全局的,它在组结束后仍然存在(由于环境而建立)。 \ifisinside
如果\global\isinsidetrue
应用了,也可以使用类似语句的东西。
当然,这不是一种万无一失的方法——根据操作情况,手动修改计数器uniquenv
将允许嵌套uniquenv
或禁止甚至第一次使用环境。
注意:下面的文档由于设计原因在这里‘失败’了!!!!
\documentclass{article}
\newcounter{uniquenv}
\newenvironment{uniquenv}{%
\ifnum\value{uniquenv} = 0
\stepcounter{uniquenv}%
\else
\GenericError{Error}{nested unique env}{You can't use a nested unique env^^J
Remove all env except the outer one!}{}
\fi
}{%
\setcounter{uniquenv}{0}
}
\begin{document}
\begin{figure}
\begin{uniquenv}
Foo
\end{uniquenv}
\begin{uniquenv}
\begin{uniquenv}
Foo inside
\end{uniquenv}
\end{uniquenv}
\end{figure}
\end{document}
更新禁止重复使用someenv
:
\documentclass{article}
\newcounter{uniquenv}
\newenvironment{someenv}{}{}
\usepackage{etoolbox}
\AtBeginDocument{someenv}{\setcounter{uniquenv}{0}}
\newenvironment{uniquenv}{%
\ifnum\value{uniquenv} = 0
\stepcounter{uniquenv}%
\else
\GenericError{Error}{nested unique env}{You can't use a nested unique env^^J
Remove all env except the outer one!}{}
\fi
}{%
}
\begin{document}
\begin{someenv}
\begin{uniquenv}
Something
\end{uniquenv}
\end{someenv}
\begin{someenv}
\begin{uniquenv}
Something
\end{uniquenv}
\begin{uniquenv}
Something more
\end{uniquenv}
\end{someenv}
\end{document}
答案2
有以下可能性:
\documentclass{article}
\usepackage{etoolbox}
\newenvironment{myenv}
{\global\uniqueenvfalse
\BeforeBeginEnvironment{unique-env}{\ifuniqueenv\errmessage{ONLY ONE}\fi}
something at startup\par}
{\par something at end}
\newenvironment{unique-env}
{\par\global\uniqueenvtrue}
{\par}
\newif\ifuniqueenv
\begin{document}
\begin{myenv}
Text
\begin{unique-env}
This should appear only once inside \texttt{myenv}
\end{unique-env}
Other text
\begin{unique-env}
This should appear only once inside \texttt{myenv}
\end{unique-env}
Other text
\end{myenv}
\end{document}
这产生了
! ONLY ONE.
\@beforebegin@unique-env@hook ...essage {ONLY ONE}
\fi
l.28 \begin{unique-env}
?