Seite 1 von 1

verschachtelte Parameter

Verfasst: So 9. Feb 2014, 12:17
von MoonKid
Schwierig zu erklären. ;)
\documentclass{scrreprt}

\usepackage{xltxtra}
\usepackage{polyglossia}
\setdefaultlanguage[spelling=new]{german}

\newenvironment{myenv}[1]{%
    \newcommand{\myeins}[1]{eins-env: #1 eins-myeins: #1}
    \begin{itemize}}{%
    \end{itemize}}

\begin{document}

    \begin{myenv}{myenv-Parameter}
        \item \myeins{myeins-Parameter}
    \end{myenv}

\end{document}
Ich möchte bestimmen ob mit #1 der Paraemter des environments oder der Paraemter des im environment definierten Makros ist.
Geht sowas?

Verfasst: So 9. Feb 2014, 12:59
von esdd
Für das "innere" Argument musst du ##1 nehmen:
\documentclass{scrreprt} 

\usepackage{xltxtra} 
\usepackage{polyglossia} 
\setdefaultlanguage[spelling=new]{german} 

\newenvironment{myenv}[1]{% 
     \newcommand{\myeins}[1]{eins-env: #1 eins-myeins: ##1} 
     \begin{itemize}}{% 
     \end{itemize}} 

\begin{document} 

     \begin{myenv}{myenv-Parameter} 
         \item \myeins{myeins-Parameter} 
     \end{myenv} 

\end{document}
Gruß
Elke

Verfasst: So 9. Feb 2014, 14:18
von MoonKid
Thx!

Verfasst: So 9. Feb 2014, 20:45
von cgnieder
Ich würde noch zwei Änderungen vornehmen: 1) die innere Umgebung nicht mit \begin/\end weglassen um bisweilen unklare Fehlermeldungen zu vermeiden, und 2) im inneren der Umgebung nicht \newcommand verwenden. Es mag zwar nichts ausmachen, da die Definition lokal erfolgt, aber wenn Du die Liste z.B. verschachtelst, würdest Du hier eine Fehlermeldung erhalten.
\documentclass{scrreprt}

% dummy-Definition
\newcommand{\myeins}[1]{}

\newenvironment{myenv}[1]
  {%
    \renewcommand{\myeins}[1]{eins-env: #1 eins-myeins: ##1}%
    \itemize
  }
  {\enditemize}

\begin{document}

\begin{myenv}{myenv-Parameter}
  \item \myeins{myeins-Parameter}
  \begin{myenv}{myenv-Parameter-2}
    \item \myeins{myeins-Parameter-2}
  \end{myenv}
\end{myenv}

\end{document}
Grüße

Verfasst: Mo 10. Feb 2014, 18:15
von MoonKid
cgnieder hat geschrieben:
\newenvironment{myenv}[1]
  {%
    \renewcommand{\myeins}[1]{eins-env: #1 eins-myeins: ##1}%
    \itemize
  }
  {\enditemize}
Den Part verstehe ich nicht ganz. Wo ist das begin-end geblieben? Zu dem \itemize find ich keine Doku.

Woher soll ich in Zukunft wissen, dass ich DAS nehmen soll. Wo ist der Vorteil?

Ich hab beides probiert. Sehe keinen Unterschied.

Verfasst: Mo 10. Feb 2014, 19:02
von cgnieder
Wenn Du beispielsweise einen Tippfehler hast und die Definiion mit \begin/\end machst:
\documentclass{scrreprt}

% dummy-Definition
\newcommand{\myeins}[1]{}

\newenvironment{myenv}[1]
  {%
    \renewcommand{\myeins}[1]{eins-env: #1 eins-myeins: ##1}%
    \begin{itemize}%
  }
  {\end{itemize}}

\begin{document}

\begin{myenv}{myenv-Parameter}
  \item \myeins{myeins-Parameter}
\end{myenw}

\end{document}
dann erhältst Du den Fehler
! LaTeX Error: \begin{itemize} on input line 15 ended by \end{myenw}.
Dabei enthält Zeile 15 doch gar kein \begin{itemize}! Es macht vielleicht nichts in diesem Fall, da Du die Umgebung selbst definiert hast. Stell Dir aber vor, Paketautoren würden das auch machen...

Die Alternative
\documentclass{scrreprt}

% dummy-Definition
\newcommand{\myeins}[1]{}

\newenvironment{myenv}[1]
  {%
    \renewcommand{\myeins}[1]{eins-env: #1 eins-myeins: ##1}%
    \itemize
  }
  {\enditemize}

\begin{document}

\begin{myenv}{myenv-Parameter}
  \item \myeins{myeins-Parameter}
\end{myenw}

\end{document}
liefert die viel aussagekräftigere Fehlermeldung
! LaTeX Error: \begin{myenv} on input line 15 ended by \end{myenw}.
Zur anderen Frage: wenn man eine Umgebung
\newenvironment{myenv}
  {start}
  {ende}
definiert, dann definiert man im Grunde genommen zwei Befehle, in etwa
\def\myenv{start}
\def\endmyenv{ende}
Das ist zwar nicht alles, was bei der Definition passiert, fasst aber das wesentliche zusammen. Das bedeutet, man kann jede Umgebung (mit Ausnahmen) auch durch zwei Befehle \umgebung/\endumgebung verwenden. Im Dokument selber ist das eher zu vermeiden, in Definitionen neuer Umgebungen aber von Vorteil, unter anderem aus obigen Grund.

Grüße