如何让计数在不同块之间(例如在嵌套循环中)保留值?例如
\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
}
将返回
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
如何才能保留这样的价值\N
并实现这样的产出?
0 1 2 3 4 5
5
答案1
您必须全局设置计数器。
请注意,\newcount\N
绝对不属于的替换文本\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}
或者,你可以使用\expandafter
以下方式联系群组外部人员:
\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
}
答案2
如果您不需要在内部循环中全局设置值,那么您可以定义\nogroup
。这个问题的核心是:{...}
括号有两个含义:它们打开和关闭组,它们保护分隔参数的内部分隔符。我们想使用它们(因为第二个含义)但不打开/关闭组:
\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
答案3
您可以使用不进行分配的循环,因此不需要将内部循环包装在括号对中以避免覆盖。
我完全照搬了您的示例(嗯……不,我们不想\newcount\N
每次使用时都执行多次\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}