Retendo valores de contagem entre blocos

Retendo valores de contagem entre blocos

Como fazer uma contagem reter valores entre blocos diferentes, por exemplo, em loops aninhados? Por exemplo

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

retornará

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

Como se consegue a retenção do valor de \Ne, consequentemente, um resultado como este?

0 1 2 3 4 5
5

Responder1

Você tem que definir o contador globalmente.

Observe que \newcount\Ndefinitivamente não pertence ao texto de substituição de \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}

insira a descrição da imagem aqui

Como alternativa, você pode usar \expandafterpara chegar fora do grupo:

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

Responder2

Se você não precisar definir o valor globalmente no loop interno, poderá definir \nogroup. O cerne deste problema é: as {...}chaves têm dois significados: elas abrem e fecham o grupo e protegem o separador interno para parâmetros separados. Queremos usá-los (por causa do segundo significado), mas sem abrir/fechar grupo:

\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

Responder3

Você pode usar um loop sem fazer atribuições, portanto, não é necessário envolver um loop interno em um par de chaves para evitar a substituição.

Assumi exatamente o seu exemplo (hmm.. não, não queremos \newcount\Nfazer isso várias vezes em cada \exampleuso!) E apenas substituí os dois \looppor \xintloop. Ele foi projetado para remover as chaves usadas para ocultar o loop interno, \repeatportanto, a contagem é mantida na saída para o loop externo.

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

insira a descrição da imagem aqui

informação relacionada