Das folgende Beispiel, in dem die Zahlen von 1 bis 5 einmal vorwärts und einmal rückwärts ausgegeben werden sollen, führt zu vielen Fehlermeldungen, obwohl ich mich m. E. an die Beschreibung des \int_step_function-Befehls in der expl3-Anleitung (interface3) gehalten habe. Was ist hier verkehrt?

Open in Online-Editor
\documentclass{article}
\usepackage{expl3}
\usepackage{xparse}

\ExplSyntaxOn

\cs_new:Npn \zahlen_vorwaerts:n #1
    {
        \cs_set:Npn \zahl_ausgeben:n #1 {#1}
        \int_step_function:nnnN {1} {1} {#1} \zahl_ausgeben:n
    }

\cs_new:Npn \zahlen_rueckwaerts:n #1
    {
        \cs_set:Npn \zahl_ausgeben:n #1 {#1}
        \int_step_function:nnnN {#1} {-1} {1} \zahl_ausgeben:n
    }

\NewDocumentCommand \Vorwaerts {m}
    {
        \zahlen_vorwaerts:n {#1}
    }

\NewDocumentCommand \Rueckwaerts {m}
    {
        \zahlen_rueckwaerts:n {#1}
    }

\ExplSyntaxOff

\begin{document}
\Vorwaerts{5}

\Rueckwaerts{5}
\end{document}

gefragt 21 Mai '16, 22:58

Cletus's gravatar image

Cletus
1.6k45566
Akzeptiert-Rate: 75%


Wenn Du eine Funktion in einer Funktion definierst, musst Du die # verdoppeln:

Open in Online-Editor
\cs_new_protected:Npn \zahlen_vorwaerts:n #1
  {
    \cs_set:Npn \zahlen_ausgeben:n ##1 {##1}
    \int_step_function:nnnN {1} {1} {#1} \zahlen_ausgeben:n
  }

Was geschieht, wenn man das nicht macht? Mit Deiner Definition wird aus \Vorwaerts{5} im ersten Schritt durch ersetzen aller #1 mit 5:

Open in Online-Editor
\cs_set:Npn \zahl_ausgeben:n 5 {5}
\int_step_function:nnnN {1} {1} {5} \zahl_ausgeben:n

Das bedeutet, \zahl_ausgeben:n wird bei Dir ohne Parameter definiert! Kein Wunder, dass es dann Fehler gibt! Mit der neuen Definition passiert durch Austauschen aller #1 mit 5 und aller ## mit #:

Open in Online-Editor
\cs_set:Npn \zahlen_ausgeben:n #1 {#1}
\int_step_function:nnnN {1} {1} {5} \zahlen_ausgeben:n

Beachte, dass ich hier \cs_new_protected:Npn für \zahlen_vorwaerts:n verwendet habe, da die innere Definition von \zahlen_ausgeben:n eh dafür sorgt, dass \zahlen_vorwaerts:n nicht expandierbar ist.

Auf der anderen Seite: wenn die Zahlen ein einheitliches Format haben sollen, dann wäre sowieso zu empfehlen, die Ausgabefunktion separat zu definieren:

Open in Online-Editor
\documentclass{article}
\usepackage{expl3}
\usepackage{xparse}

\ExplSyntaxOn
\cs_new:Npn \zahlen_ausgeben:n #1 {#1}

\cs_new:Npn \zahlen_vorwaerts:n #1
  { \int_step_function:nnnN {1} {1} {#1} \zahlen_ausgeben:n }

\cs_new:Npn \zahlen_rueckwaerts:n #1
  { \int_step_function:nnnN {#1} {-1} {1} \zahlen_ausgeben:n }

\NewDocumentCommand \Vorwaerts {m}
  { \zahlen_vorwaerts:n {#1} }

\NewDocumentCommand \Rueckwaerts {m}
  { \zahlen_rueckwaerts:n {#1} }
\ExplSyntaxOff

\begin{document}

\Vorwaerts{5} \par
\Rueckwaerts{5}

\end{document}
Permanenter link

beantwortet 22 Mai '16, 10:39

cgnieder's gravatar image

cgnieder
22.1k243463
Akzeptiert-Rate: 60%

bearbeitet 23 Mai '16, 12:32

Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×21
×13

gestellte Frage: 21 Mai '16, 22:58

Frage wurde gesehen: 5,109 Mal

zuletzt geändert: 23 Mai '16, 12:32