newenvironment

Redefinition von Makros, Definition eigener Befehle sowie neuer Umgebungen


marcelinho
Forum-Newbie
Forum-Newbie
Beiträge: 6
Registriert: Di 15. Sep 2009, 20:47

newenvironment

Beitrag 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?

ratte

Beitrag 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}{}

phi
Moderator
Moderator
Beiträge: 420
Registriert: Fr 6. Feb 2009, 21:28

Re: newenvironment

Beitrag 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
}

Saubär

Beitrag 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.

Saubär

Beitrag 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? ;-)

marcelinho
Forum-Newbie
Forum-Newbie
Beiträge: 6
Registriert: Di 15. Sep 2009, 20:47

Beitrag von marcelinho »

Ok, das klappt, danke!

Antworten