\newenvironment 是否有一个 \provideenvironment 同类,就像 \newcommand 有 \providecommand 一样?

\newenvironment 是否有一个 \provideenvironment 同类,就像 \newcommand 有 \providecommand 一样?

为了避免必须决定是否使用\newcommand或 的问题\renewcommand,LaTeX 提供了 选项\providecommand

对于环境来说,是否有与此相对应的东西?我希望能够键入\provideenvironment(或类似内容),而不是先使用\newenvironment,然后使用\renewenvironment

答案1

我不相信\provideenvironment任何地方有定义,但你可以定义它。

\documentclass{article}

\makeatletter
\def\provideenvironment{\@star@or@long\provide@environment}
\def\provide@environment#1{%
        \@ifundefined{#1}%
                {\def\reserved@a{\newenvironment{#1}}}%
                {\def\reserved@a{\renewenvironment{dummy@environ}}}%
        \reserved@a
}
\def\dummy@environ{}
\makeatother

\provideenvironment{foo}[1][blarg]{begin foo: #1 }{end foo}
\provideenvironment{foo}{asdf}{asdf}
\begin{document}
\begin{foo}
whee
\end{foo}
\end{document}

第一次foo被定义。第二次则没有被定义,因为它已经被定义。

答案2

不。

如果你熟悉expl3(但不是必须的),你可以\ProvideDocumentEnvironmentxparse包中使用。语法略有不同。例如:

\usepackage{xparse}
\ProvideDocumentEnvironment{foo}{ o m }{%
  \IfNoValueTF{#1}{only #2}{#1 and #2}%
}{%
  \IfNoValueTF{#1}{only #2}{#1 and #2}%
}

答案3

\provideenvironment包裹里有一个makecmds。我想这就是你要找的。它的语法与 的语法类似\newenvironment

相关内容