检查子环境在环境中是否唯一

检查子环境在环境中是否唯一

我想在另一个环境中定义一个环境,但我需要确保新环境是唯一的,因此只能有一个。环境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}

? 

相关内容