Nerd 032F hat geschrieben:\newcommand*{\provideenvironment}{%
\@ifstar {\@sprovideenvironment}{\@provideenvironment}%
}
\newcommand*{\@sprovideenvironment}[1]{%
\@ifundefined{#1}{\newenvironment*{#1}}{\@gobbletwo}%
}
\newcommand*{\@provideenvironment}[1]{%
\@ifundefined{#1}{\newenvironment{#1}}{\@gobbletwo}%
}
Das alleine nützt noch gar nichts. Hier werden nämlich die Argumente noch gar nicht berücksichtigt. Damit bringt auch die Sternvariante nichts. Ein \provideenvironment müsste ja folgende Möglichkeiten berücksichtigen:
- \provideenvironment{NAME}{BEGIN}{END}
- \provideenvironment*{NAME]{BEGIN}{END}
- \provideenvironment{NAME}[1-9]{BEGIN}{END}
- \provideenvironment*{NAME}[1-9]{BEGIN}{END}
- \provideenvironment{NAME}[1-9][DEFAULT]{BEGIN}{END}
- \provideenvironment*{NAME}[1-9][DEFAULT]{BEGIN}{END}
Obige Lösung berücksichtigt aber nur die Möglichkeiten 1 und 2. Die übrigen Möglichkeiten werden von \@gobbletwo nicht korrekt behandelt. Man benötigt also eigentlich ein \@gobbletwooptionalandtwomandatory:
\newcommand*{\@gobbletwooptionalandtwomandatory}[1][]{%
\@gobbleoneoptionalandtwomandatory}
\newcommand*{\@gobbleoneoptionalandtwomandatory}[3][]{}
Ausprobiert habe ich das nicht. Besser wäre eventuell, wenn man stattdessen den Trick, den LaTeX bei \providecommand auf \provideenvironment überträgt:
\def\provideenvironment{\@star@or@long\provide@environment}
\def\provide@environment#1{%
\@ifundefined{#1}{%
{\def\reserved@a{\new@environment{#1}}%
{\def\reserved@a{\renew@environment{reserved@a}}%
\reserved@a}%
Dabei wird also im Falle, dass die Umgebung bereits definiert ist, einfach die Umgebung reserved@a umdefiniert, also \reserved@a und \endreserved@a. Dass dabei die Anweisung \endreserved@a neu definiert wird, sollte kein Problem sein. Ich denke nicht, dass irgend jemand diese Anweisung für etwas sinnvolles verwendet. Wenn man Befürchtungen hat, kann man sich zuvor (also außerdem der Definition von \provide@environment) mit
\@ifundefined{endreserved@a}{}{\@latex@error{%
Command \@backslashchar endreserved@a already defined}\@eha
}
absichern.
Wie gesagt, das ist ungetestet. Falls es nicht funktioniert, wäre ein Testdokument praktisch.
PS: Letztlich ist das auch nur die \@ifstar-Variante. Da hier aber das Verhalten identisch zu dem der entsprechenden LaTeX-Befehle ist, halte ich das für die durchaus gewollte Lösung.