以下 C# 嵌套循环的 TeX 等效项是什么?

以下 C# 嵌套循环的 TeX 等效项是什么?

我需要一个嵌套循环来为 PSTricks 图表制作动画。在 C#、C 或 C++ 中,我通常这样写。

int N=6;
for(int x=0; x<N; x++)
    for(int y=x+1; y<N; y++)
        Console.WriteLine("({0}, {1})",x,y);

我曾尝试在 TeX 中按如下方式执行此操作,但没有成功。:-)

\documentclass{minimal}
\usepackage{multido}

\newcommand\N{6}
\newcommand\Init{}
\newcommand\Freq{}
\begin{document}
\multido{\ix=0+1}{\N}
{
        \makeatletter
            \renewcommand\Init{\strip@pt\dimexpr\ix pt + 1pt\relax}         
            \renewcommand\Freq{\strip@pt\dimexpr\N pt - \Init pt\relax}
        \makeatother
        \multido{\iy=\Init+1}{\Freq}
        {
                (\ix, \iy)\par
        }
}
\end{document}

如何修复?

答案1

\documentclass{minimal}
\usepackage{multido}

\newcommand\N{6}
\begin{document}
\multido{\ix=0+1,\ixB=1+1,\iN=5+-1}{\N}{%
  \multido{\iy=\ixB+1}{\iN}{(\ix, \iy)\endgraf}}
\end{document}

并配有计数器:

\documentclass{minimal}
\usepackage{multido}
\newcommand\N{6}
\newcounter{NminusOne}
\setcounter{NminusOne}{\N}\addtocounter{NminusOne}{-1}

\begin{document}
\multido{\ix=0+1,\ixB=1+1,\iN=\theNminusOne+-1}{\N}{%
  \multido{\iy=\ixB+1}{\iN}{(\ix, \iy)\endgraf}}
\end{document}

答案2

您需要使用\edef来扩展宏内容。使用\renewcommand只是一遍又一遍地将宏重新定义为完全相同的内容。\ix\Init宏具有变化的值在这里无关紧要。您不能在 中包含段落,\multido因为它未定义\long。因此,请使用\\或隐藏\par宏中的 。您还需要注意换行符引入的空格,例如}和之后{\makeatletter\makeatother宏必须位于\multido宏之外,否则更改 catcode 已经太晚了。

\documentclass{minimal}
\usepackage{multido}

\newcommand\N{6}
\newcommand\Init{}
\newcommand\Freq{}
\newcommand\mypar{\par}
\begin{document}
\makeatletter
\multido{\ix=0+1}{\N}{%
    \edef\Init{\strip@pt\dimexpr\ix pt + 1pt\relax}%
    \edef\Freq{\strip@pt\dimexpr\N pt - \Init pt\relax}%
    \multido{\iy=\Init+1}{\Freq}{%
        (\ix, \iy)\mypar
    }%
}
\makeatother
\end{document}

答案3

以下是赫伯特回答的简化版本。

\documentclass{minimal}
\usepackage{multido}
\newcommand\N{6}


\newcounter{NTemp}
\setcounter{NTemp}{\N}

\begin{document}
\multido{\ix=0+1,\iTemp=1+1}{\N}
{
  \addtocounter{NTemp}{-1}
  \multido{\iy=\iTemp+1}{\theNTemp}
  {
    (\ix, \iy)\endgraf
  }
}
\end{document}

答案4

\documentclass{minimal}
\usepackage{multido}


\newcommand{\N}{6}
\newcounter{Init}
\newcounter{Freq}
\setcounter{Freq}{\N}
\newcommand\mypar{\par}

\begin{document}
\multido{\ix=0+1}{\N}
{
    \setcounter{Init}{\ix}
    \addtocounter{Init}{1}
    \addtocounter{Freq}{-1}
    \multido{\iy=\value{Init}+1}{\value{Freq}}
    {
        (\ix, \iy)\endgraf
    }
}
\end{document}

相关内容