Beibehalten von Zählwerten zwischen Blöcken

Beibehalten von Zählwerten zwischen Blöcken

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 \Nund 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\Ndefinitiv 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}

Bildbeschreibung hier eingeben

Alternativ können Sie \expandafterfü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\Nmehrmals 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}

Bildbeschreibung hier eingeben

verwandte Informationen