我需要一个嵌套循环来为 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}