
Wie kann man erreichen, dass ein Zähler Werte zwischen verschiedenen Blöcken behält, z. B. in verschachtelten Schleifen? Zum Beispiel
\newcommand\example
{%
\newcount\N
\loop
{\loop
\the\N\quad
\ifnum\N<5
\advance\N by 1
\repeat
}%
\the\N
\ifnum\N<5
\advance\N by 1
\repeat
}
wird zurückkehren
0 1 2 3 4 5
0
1 2 3 4 5
1
2 3 4 5
2
3 4 5
3
4 5
4
5
5
Wie kann der Werterhalt \N
und damit ein derartiger Output erreicht werden?
0 1 2 3 4 5
5
Antwort1
Sie müssen den Zähler global einstellen.
Beachten Sie, dass dies \newcount\N
definitiv nicht zum Ersetzungstext für gehört \example
.
\documentclass{article}
\newcount\N
\newcommand\example{%
\global\N=0
\loop
{\loop
\the\N\quad
\ifnum\N<5
\global\advance\N by 1
\repeat
}%
\par
\the\N\par
\ifnum\N<5
\global\advance\N by 1
\repeat
}
\begin{document}
\example
\end{document}
Alternativ können Sie \expandafter
für die Kontaktaufnahme außerhalb der Gruppe Folgendes verwenden:
\newcount\N
\newcommand\example{%
\N=0
\loop
{\loop
\the\N\quad
\ifnum\N<5
\advance\N by 1
\repeat
\expandafter
}\expandafter\N\the\N\relax
\par
\the\N\par
\ifnum\N<5
\advance\N by 1
\repeat
}
Antwort2
Wenn Sie den Wert in der inneren Schleife nicht global festlegen müssen, können Sie definieren \nogroup
. Der Kern dieses Problems ist: Die {...}
Klammern haben zwei Bedeutungen: Sie öffnen und schließen die Gruppe und sie schützen den inneren Trenner für getrennte Parameter. Wir möchten sie (aufgrund der zweiten Bedeutung) verwenden, aber ohne öffnende/schließende Gruppe:
\newcount\N
\def\nogroup#1{#1}
\def\example
{%
\loop
\nogroup{\loop
\the\N\quad
\ifnum\N<5
\advance\N by 1
\repeat
}%
\endgraf
\the\N
\endgraf
\ifnum\N<5
\advance\N by 1
\repeat
}
\example
\bye
Antwort3
Sie können eine Schleife verwenden, die keine Zuweisungen vornimmt. Daher müssen Sie eine innere Schleife nicht in ein Klammernpaar einschließen, um ein Überschreiben zu vermeiden.
Ich habe Ihr Beispiel genau übernommen (hmm ... nein, wir wollen es nicht bei jeder Verwendung \newcount\N
mehrmals ausführen !) und habe nur die beiden 's durch ersetzt . Es ist so konzipiert, dass die Klammern entfernt werden, die zum Ausblenden des inneren verwendet werden, sodass die Zählschritte beim Verlassen der äußeren Schleife beibehalten werden.\example
\loop
\xintloop
\repeat
\documentclass{article}
\usepackage{xinttools}
\begin{document}
\newcount\N
\newcommand\example
{%
\xintloop
{\xintloop
\the\N\quad
\ifnum\N<5
\advance\N by 1
\repeat
}%
\the\N
\ifnum\N<5
\advance\N by 1
\repeat
}
\example
\end{document}