为了避免必须决定是否使用\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
(但不是必须的),你可以\ProvideDocumentEnvironment
在xparse
包中使用。语法略有不同。例如:
\usepackage{xparse}
\ProvideDocumentEnvironment{foo}{ o m }{%
\IfNoValueTF{#1}{only #2}{#1 and #2}%
}{%
\IfNoValueTF{#1}{only #2}{#1 and #2}%
}
答案3
\provideenvironment
包裹里有一个makecmds
。我想这就是你要找的。它的语法与 的语法类似\newenvironment
。