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
。)