در نسخه 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}