如果是,则等于,但如果大于 ,则\zNonZero
等于。问题是,循环内的检查每次迭代都会执行:我只需要执行一次(第一次迭代)。有没有办法摆脱不必要的检查?0
#1
0
1
#1
0
if
\begin{document}
\parindent0pt
\newcount\zNonZero
\def\zLoop#1%
{ \zNonZero1
\ifnum#1<1 % HOW TO CHECK THIS ONLY ONCE?
\zNonZero0
\fi
\ifnum#1<5
#1...(\the\zNonZero)\newline
\expandafter\zLoop\expandafter{\the\numexpr#1+1\relax}
\fi
}
\zLoop{0}
\end{document}
这里“if”检查了 5 次,但我们只需要检查一次:
答案1
分离第一个条件。
\documentclass{article}
\newcount\zNonZero
\def\zLoop#1{%
\zNonZero=1
\zLoopStart{#1}%
\zLoopLoop{#1}%
}
\def\zLoopStart#1{%
\ifnum#1<1 % HOW TO CHECK THIS ONLY ONCE?
\zNonZero=0
\fi
}
\def\zLoopLoop#1{%
\ifnum#1<5
#1...(\the\zNonZero)\par
\zNonZero=1
\expandafter\zLoopLoop\expandafter{\the\numexpr#1+1\expandafter\relax\expandafter}%
\fi
}
\setlength{\parindent}{0pt}
\begin{document}
\zLoop{0}
\end{document}
注意另外两个\expandafter
标记,以便在循环重新启动之前删除整个条件。
这可能不符合条件,但我还是要提一下。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewExpandableDocumentCommand{\zLoop}{m}
{
\bp_zloop:n { #1 }
}
\cs_new:Nn \bp_zloop:n
{
\int_compare:nT { #1 < 5 }
{
#1...(\int_eval:n { \int_min:nn { #1 } { 1 } })\par
\bp_zloop:f { \int_eval:n { #1 + 1 } }
}
}
\cs_generate_variant:Nn \bp_zloop:n { f }
\ExplSyntaxOff
\begin{document}
\zLoop{0}
\end{document}
答案2
\documentclass{article}
\begin{document}
\parindent0pt
\newcount\zNonZero
\newif\ifCheck \Checktrue
\def\zLoop#1{%
\zNonZero1
\ifCheck\ifnum#1<1 \zNonZero0 \fi\Checkfalse\fi
\ifnum#1<5
#1...(\the\zNonZero)\newline
\expandafter\zLoop\expandafter{\the\numexpr#1+1\relax}
\fi
\Checktrue
}
\zLoop{0}
\end{document}