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?
newenvironment
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
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:Warum kann ich die Parameter beim Definieren einer neuen Umgebung (newenvironment) nur für den Beginn der Umgebung benutzen
Du musst sie zwischenspeichern:marcelinho hat geschrieben:und kennt jemand vielleicht einen Weg, sie auch für das Ende zu benutzen?
\newenvironment{X}[1]{% \newcommand*{\Xarg}{#1}% }{% % hier kann jetzt \Xarg benutzt werden }
Das mit dem \newcommand\Xarg geht aber in die Hose, wenn man die Umgebung in sich selbst nochmal aufruft, also etwas wie
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:
definieren.
\begin{X} ... \begin{X} ... \end{X} ... \end{X}
\newcommand*{\fooargA}{% \PackageWarning{foo}{command \string\fooargA\space should not be used by user or outside \string\begin{foo}...\string\end{foo}}% }
Da sind zwei Klammern zu viel. Richtig wäre;ratte hat geschrieben:\newenvironment{foo}[2]{% \def\fooparA}{#1}% \def\fooparB}{#2}% ... }{% Parameter 1 war: \fooparA, Parameter 2 war \fooparB } \newcommand*{\fooparA}{} \newcommand*{\fooparB}{}
\newenvironment{foo}[2]{% \def\fooparA{#1}% \def\fooparB{#2}% ... }{% Parameter 1 war: \fooparA, Parameter 2 war \fooparB } \newcommand*{\fooparA}{} \newcommand*{\fooparB}{}
-
- Forum-Newbie
- Beiträge: 6
- Registriert: Di 15. Sep 2009, 20:47