verschachtelte Parameter

Fragen und Probleme, die nicht den obigen Kategorien zugeordnet werden können


MoonKid
Forum-Meister
Forum-Meister
Beiträge: 690
Registriert: Sa 30. Jun 2012, 11:56

verschachtelte Parameter

Beitrag 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?
XeLaTeX, TeX Live, vim-latexsuite

esdd
Forum-Meister
Forum-Meister
Beiträge: 2561
Registriert: So 7. Feb 2010, 16:36

Beitrag 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

MoonKid
Forum-Meister
Forum-Meister
Beiträge: 690
Registriert: Sa 30. Jun 2012, 11:56

Beitrag von MoonKid »

Thx!
XeLaTeX, TeX Live, vim-latexsuite

Benutzeravatar
cgnieder
Forum-Meister
Forum-Meister
Beiträge: 730
Registriert: Fr 22. Okt 2010, 18:37
Wohnort: Herrenberg
Kontaktdaten:

Beitrag 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
Clemens
Paketauthor

MoonKid
Forum-Meister
Forum-Meister
Beiträge: 690
Registriert: Sa 30. Jun 2012, 11:56

Beitrag 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.
XeLaTeX, TeX Live, vim-latexsuite

Benutzeravatar
cgnieder
Forum-Meister
Forum-Meister
Beiträge: 730
Registriert: Fr 22. Okt 2010, 18:37
Wohnort: Herrenberg
Kontaktdaten:

Beitrag 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
Clemens
Paketauthor

Antworten