Seite 1 von 1
newenvironment
Verfasst: Di 15. Sep 2009, 20:56
von marcelinho
Hallo,
Warum kann ich die Parameter beim Definieren einer neuen Umgebung (newenvironment) nur für den Beginn der Umgebung benutzen und kennt jemand vielleicht einen Weg, sie auch für das Ende zu benutzen?
Verfasst: Mi 16. Sep 2009, 10:33
von ratte
Bei \newenvironment{foo}[n]
Minimalbeispiel{BEGIN}{END} macht LaTeX intern im Prinzip \newcommand{\foo}[n]
Minimalbeispiel{BEGIN}\newcommand{\endfoo}{END}. Damit dürfte klar sein, warum die Parameter nur in BEGIN zur Verfügung stellen. Die allgemeine Empfehlung für Parameter im END-Teil ist etwas wie:
\newenvironment{foo}[2]{%
\def\fooparA}{#1}%
\def\fooparB}{#2}%
...
}{%
Parameter 1 war: \fooparA, Parameter 2 war \fooparB
}
\newcommand*{\fooparA}{}
\newcommand*{\fooparB}{}
Re: newenvironment
Verfasst: Mi 16. Sep 2009, 12:24
von phi
marcelinho hat geschrieben:Warum kann ich die Parameter beim Definieren einer neuen Umgebung (newenvironment) nur für den Beginn der Umgebung benutzen
Weil Umgebungen nur eine andere Schreibweise für Befehle sind. \begin{X} wird grob gesagt ersetzt durch
\begingroup\X, deswegen kann der Befehl \X auf Argumente, die nach \begin{X} kommen, zugreifen. \end{X} entspricht grob
\endX\endgroup, der Befehl \endX ist dabei völlig unabhängig von \X.
marcelinho hat geschrieben:und kennt jemand vielleicht einen Weg, sie auch für das Ende zu benutzen?
Du musst sie zwischenspeichern:
\newenvironment{X}[1]{%
\newcommand*{\Xarg}{#1}%
}{%
% hier kann jetzt \Xarg benutzt werden
}
Verfasst: Mi 16. Sep 2009, 15:19
von Saubär
Das mit dem \newcommand\Xarg geht aber in die Hose, wenn man die Umgebung in sich selbst nochmal aufruft, also etwas wie
\begin{X}
...
\begin{X}
...
\end{X}
...
\end{X}
verwendet. Die Lösung von ratte mit einen \def\fooargA, das außerhalb der Definition der Umgebung mit einem \newcommand*{\fooargA}{} abgesichert wird, würfte also deutlich besser sein, als Deine nachgeschobene Lösung. Statt einem leeren Argument kann man beim Schreiben eines Pakets dann zur Sicherheit auch gleich etwas wie:
\newcommand*{\fooargA}{%
\PackageWarning{foo}{command \string\fooargA\space should not be used by user or outside \string\begin{foo}...\string\end{foo}}%
}
definieren.
Verfasst: Mi 16. Sep 2009, 15:23
von Saubär
ratte hat geschrieben:\newenvironment{foo}[2]{%
\def\fooparA}{#1}%
\def\fooparB}{#2}%
...
}{%
Parameter 1 war: \fooparA, Parameter 2 war \fooparB
}
\newcommand*{\fooparA}{}
\newcommand*{\fooparB}{}
Da sind zwei Klammern zu viel. Richtig wäre;
\newenvironment{foo}[2]{%
\def\fooparA{#1}%
\def\fooparB{#2}%
...
}{%
Parameter 1 war: \fooparA, Parameter 2 war \fooparB
}
\newcommand*{\fooparA}{}
\newcommand*{\fooparB}{}
Hattest Du da etwa auch erst \newcommand stehen?

Verfasst: Mi 16. Sep 2009, 20:28
von marcelinho
Ok, das klappt, danke!