保留块之间的计数值

保留块之间的计数值

如何让计数在不同块之间(例如在嵌套循环中)保留值?例如

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

在此处输入图片描述

相关内容