如何使用一维循环模拟二维循环?

如何使用一维循环模拟二维循环?

animate包不允许嵌套循环。只允许单个循环。但是,我们经常需要在单个循环中模拟二维空间。

请参阅以下我想要在 LaTeX 中实现的 C# 代码。

static void Main()
{
    const int M = 3;
    const int N = 4;
    int i = 0;
    int j = 0;

    for (int c = 0; c < M * N; c++)
    {
        if (i >= N)
        {
            j++;
            i = 0;
            //newline
        }
        //print i and j
        i++;
    }
}

实际场景是使用animate包创建 PDF 动画,而不是 GIF 动画此链接


最后编辑:

因为我在下面的真实场景中使用了 Altermundus 的答案,

\documentclass{article}
\usepackage{graphicx}
\usepackage{animate}
\usepackage{pstricks}
\SpecialCoor

\newsavebox\IBox
\savebox\IBox{\includegraphics{Images/bald}}
\def\N{2}% columns
\def\M{3}% rows
\psset{xunit=\dimexpr\wd\IBox/\N\relax,yunit=\dimexpr\ht\IBox/\M\relax}


\begin{document}
\animateinline[palindrome,autoplay]{1}
\newcounter{i}\newcounter{j}
\multiframe{\numexpr\N*\M\relax}{}
{   
    \unless\ifnum\value{i}<\N\relax
            \addtocounter{j}{1}%
            \setcounter{i}{0}%
    \fi
    \begin{pspicture}[showgrid](\N,\M)
        \begin{psclip}{\psframe[linestyle=none]
                (!\thei\space \thej)
                (!\thei\space 1 add \thej\space 1 add)}
            \rput[bl](0,0){\usebox\IBox}
        \end{psclip}
    \end{pspicture}
    \addtocounter{i}{1}
}
\endanimateinline
\end{document}

所以我会接受他的回答。

其他答案当然也会得到+1!

注意:用 进行编译xelatex。动画导入图像不能用 进行工作latex-dvips-ps2pdf\newcount也不起作用,请改用 \newcounter

答案1

我不知道你为什么\numexpr在这种情况下使用。如果你想使用像这样的数学表达式,这个宏很有用\numexpr 3-3*13/5\relax。你需要正确地完成表达式才能停止\numexpr,所以\relax需要。我不明白你想要什么和代码,所以我给你一些可能的代码:

\ifnum\n<3 \relax ... \ifnum\n<\numexpr 3\relax \ifnum\n<\numexpr3*\yy\relax

\thexx在您的情况下是错误的,\the\xx也许您需要混合使用\newcount.Texnewcounter和 LaTeX 计数器!

我不知道为什么你multido在这种情况下需要,如果步骤是 1,你可以使用一个简单的\loop... \repeat

根据您的解释,我的新代码是(它与 Andrew 的代码相同,但我不使用multido,我使用numexpr

\documentclass{article}

\def\M{3}
\def\N{4}

\newcount\i
\i=0
\newcount\j
\j=0
\newcount\n
\n=0  
\parindent=0pt

\begin{document}

\loop
\unless\ifnum\n=\numexpr\N*\M\relax  % like Herbert, in this case 
 % better is \ifnum\n<\numexpr\N*\M\relax without \unless
  (\the\i,\the\j)
  \advance \j by 1\relax
  \unless\ifnum\the\j<\N\relax
  \newline
  \advance \i by 1\relax
  \j=0\relax
  \fi
  \advance \n by 1
\repeat 
\end{document}

结果是一样的

答案2

\documentclass{article}
\parindent=0pt
\newcount\xx\xx=1
\newcount\yy\yy=1
\newcount\n\n=1
\newcount\N
\begin{document}
\loop
  \ifnum\N<9
    \ifnum\n<4
      (\the\yy,\the\xx) 
      \advance\xx1 \advance\n1 \advance\N1
    \else
      \newline        
      \advance\yy1 
      \xx=1\n=1
    \fi 
\repeat

\end{document} 

在此处输入图片描述

答案3

以下参考该问题的第一个版本。 我怀疑当前版本中的代码无法正常工作的原因是类似的,但我对所涉及的原语了解不够,无法对其进行调试。

位有问题\number\numexpr3\yy\relax。传递给的\ifnum只是3,而没有传递\yy。因此测试是\ifnum\n<3。然后它读取\yy;由于这是一个新语句,它期望为该计数分配一个数字,但它得到了,\relax所以它会抱怨。

\ifnum我对、\number和如何相互作用了解不够,\numexpr无法提出解决该行问题的修复方法,但我确实有一个关于如何从单个循环中获取所需输出的建议。

下面现谈谈该问题的第二个版本。

查看代码时,我看到三个变量:虚拟变量\n,然后是两个坐标变量\i\j。测试是在虚拟变量上进行的,但更自然的做法是在坐标上进行。下面,\n只是为了确保循环进行足够多次。然后我们\j每次都增加,直到它达到阈值,然后我们将其重置并增加\i

\documentclass{article}
%\url{http://tex.stackexchange.com/q/25722/86}
\usepackage{multido}

\def\M{3}
\def\N{4}

\newcount\i
\i=0

\newcount\j
\j=0

\parindent=0pt

% Figure out how many iterations we need to do.
\makeatletter
\@tempcnta=\M\relax
\multiply\@tempcnta by \N\relax
\edef\MN{\the\@tempcnta}%
\makeatother

\begin{document}

\multido{\n=0+1}{\MN}
{
  (\the\i,\the\j)
  \advance \j by 1\relax
  \unless\ifnum\the\j<\N\relax
  \newline
  \advance \i by 1\relax
  \j=0\relax
  \fi
}

\end{document}

结果:

(0,0) (0,1) (0,2) (0,3)
(1,0) (1,1) (1,2) (1,3)
(2,0) (2,1) (2,2) (2,3)

(我怀疑我已经将\i\j从您的代码中交换了。对我来说,行在前面并且是i,列在后面并且是j。)

相关内容