
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 \N
e, consequentemente, um resultado como este?
0 1 2 3 4 5
5
Responder1
Você tem que definir o contador globalmente.
Observe que \newcount\N
definitivamente 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}
Como alternativa, você pode usar \expandafter
para 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\N
fazer isso várias vezes em cada \example
uso!) E apenas substituí os dois \loop
por \xintloop
. Ele foi projetado para remover as chaves usadas para ocultar o loop interno, \repeat
portanto, 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}