در نسخه 31.3 بسته bidi (نسخه 1.0 بسته biditools) که تازه به CTAN داده شده یک ساختار کلی حلقه تعریف شده است.
\looprepeat
\forvariable{<var>} \fromvalue{<start>} \bystep{<step>} \tovalue{<end>} \downtovalue{<end>}
\untilcondition{<cond>} \whilecondition{<cond>}
\doloopbody { <loop body> }
دستوراتی که بین \looprepeat و \doloopbody هستند کاملاً اختیاری هستند. بنابراین دستورات \looprepeat و \doloopbody اجباری هستند و سایر دستورات اختیاری هستند. همچنین در صورت تمایل میتونید از محیط looprepeat و نه دستور \looprepeat استفاده کنید.
<var> نام متغییری هست که شما انتخاب میکنید و میتونه از یک یا چندین حرف تشکیل شده باشه. بعد از دستور \forvariable نام متغیر بصورت یک دستور قابل استفاده است. مثلاً اگر گفته باشید \forvariable{xyz} بعد از دستور \forvariable دستور \xyz تعریف شده است که شمارنده حلقه هست. در واقع این یک count هست که برای چاپ شدنش میتونید از \the\xyz یا \number\xyz استفاده کنید.
<start> یک عدد کامل integer هست که مقدار اولیه متغیر شما رو مشخص میکنه. <step> یک عدد کامل integer هست که مقدار گام (یا پرش بین اعداد) رو مشخص میکنه. <end> یک عدد کامل integer هست که مقدار آخر متغیر شما رو مشخص میکنه. اگر از دستورات \fromvalue، \bystep، \tovalue و \downtovalue استفاده نکنید مقدار پیشفرض <start>، <step> و <end> عدد ۱ هست.
اگر از دستور \tovalue استفاده کنید شمارنده متغیر زیاد میشوند اما اگر از دستور \downtovalue استفاده کنید شمارنده متغیر کم میشود.
مقدار گام یا پرشی که توسط دستور \bystep مشخص میکنید همیشه باید مثبت باشه.
<cond> سری دستورات تک هست که در آخرش تست \if... وجود داره که \if... میتونی هر دستور شرطی باشه که برای تک تعریف شده مثل \ifnum. احتیاجی به پایان دادن دستور شرطی با \fi در دستورات \whilecondition و \untilcondition نیست.
تفاوت بین دستورات \whilecondition و \untilcondition در اینه که \whilecondition در ابتدای بدنه حلقه (<loop body>) اجرا میشه اما \untilcondition در انتهای بدنه حلقه (<loop body>) اجرا میشه.
هر جایی که بخواهید از حلقه خارج بشید میتونید از دستور \breaklooprepeat استفاده کنید. اگر از دستورهای شرطی \if... تک استفاده میکنید دستور \breaklooprepeat باید بصورت زیر استفاده بشه.
\if... \expandafter \breaklooprepeat \fi
<loop body> کار اصلی هست که باید توی حلقه انجام بشه.
فایل نمونه
\documentclass{article}
\usepackage{biditools}
\begin{document}
%\tracingmacros2
\newcount\tmpcount % used in some examples below
\looprepeat \forvariable{i}
\bystep{2}
\doloopbody {%
\ifnum\i=13 \expandafter\breaklooprepeat \fi
\number\i{} %
}%
\looprepeat \forvariable{iii}
\tovalue{8}
\doloopbody {}
After loop: \number\iii%
\looprepeat \forvariable{i}
\fromvalue{10}
\bystep{2}
\downtovalue{0}
\doloopbody {\number\i{} }
\looprepeat \forvariable{x} \whilecondition{\ifnum\x<7}
\doloopbody {\number\x{} }
\looprepeat \tovalue{3} \doloopbody {Hello world! }
\looprepeat \forvariable{j}
\untilcondition{\tmpcount\j \divide\tmpcount by 37 \noexpand\ifnum\tmpcount=1}
\doloopbody {\number\j{} }
\looprepeat \forvariable{i} \bystep{2} \tovalue{10} \doloopbody
{\looprepeat \forvariable{j} \fromvalue{\i} \bystep{3} \tovalue{18}
\doloopbody {(\number\i.\number\j) }
}
% infinite loop
%\looprepeat \doloopbody {}
\end{document}

اگر بخواهید از محیط looprepeat و نه دستور \looprepeat استفاده کنید نمونه کاملاً یکی است.
\documentclass{article}
\usepackage{biditools}
\begin{document}
%\tracingmacros2
\newcount\tmpcount % used in some examples below
\begin{looprepeat} \forvariable{i}
\bystep{2}
\doloopbody {%
\ifnum\i=13 \expandafter\breaklooprepeat \fi
\number\i{} %
}%
\end{looprepeat}
\begin{looprepeat} \forvariable{iii}
\tovalue{8}
\doloopbody {}
\end{looprepeat}
After loop: \number\iii%
\begin{looprepeat} \forvariable{i}
\fromvalue{10}
\bystep{2}
\downtovalue{0}
\doloopbody {\number\i{} }
\end{looprepeat}
\begin{looprepeat} \forvariable{x} \whilecondition{\ifnum\x<7}
\doloopbody {\number\x{} }
\end{looprepeat}
\begin{looprepeat} \tovalue{3} \doloopbody {Hello world! }
\end{looprepeat}
\begin{looprepeat} \forvariable{j}
\untilcondition{\tmpcount\j \divide\tmpcount by 37 \noexpand\ifnum\tmpcount=1}
\doloopbody {\number\j{} }
\end{looprepeat}
\begin{looprepeat} \forvariable{i} \bystep{2} \tovalue{10} \doloopbody
{\begin{looprepeat} \forvariable{j} \fromvalue{\i} \bystep{3} \tovalue{18}
\doloopbody {(\number\i.\number\j) }
\end{looprepeat}
}
\end{looprepeat}
% infinite loop
%\begin{looprepeat} \doloopbody {}
% \end{looprepeat}
\end{document}
