
ich habe das{C/4/a/n,D/4/b/n,E/4/c/n}
So iteriere ich es mit foreach:
\foreach \x\y\w\z in {C/4/a/n,D/4/b/n,E/4/c/n} {
\x - \y - \w - \z
}
Aber ich muss es mit Forloop machen. Es ist wichtig, x, y, w und z trennen zu können und keine Pakete zu verwenden, die in Overleaf installiert werden müssen, wie expl3 oder ähnliches.
Antwort1
Das Folgende definiert eine Funktion zum Durchlaufen von Listen mit zwei verschiedenen Modi. Der erste ist eine einfache, durch Kommas getrennte Werteliste und #1
bezieht sich auf das aktuelle Listenelement (dies ist nur ein \clist_map_inline:n
).
Der zweite Modus verwendet als optionales Argument ein Trennzeichen für die Unterlisten. Wenn dieses angegeben ist, können Sie mit auf die Unterlisten #1{<n>}
und mit auf die vollständige Liste zugreifen #2
. Das Ganze funktioniert (anders als bei \foreach
) ohne Gruppen, also hoffe ich, dass es bei Ihnen funktioniert.
\documentclass{article}
\ExplSyntaxOn
\int_new:N \g__arturo_nested_level_int
\NewDocumentCommand \ForEach { +o +m +m }
{
\IfNoValueTF {#1}
{ \clist_map_inline:nn {#2} {#3} }
{ \__arturo_foreach:nnn {#1} {#2} {#3} }
}
\cs_new_protected:Npn \__arturo_foreach:nnn #1#2#3
{
\int_gincr:N \g__arturo_nested_level_int
\__arturo_foreach_aux:ccnnn
{ __arturo_foreach_code_ \int_use:N \g__arturo_nested_level_int :nn }
{ l__arturo_foreach_items_ \int_use:N \g__arturo_nested_level_int _seq }
{#1} {#2} {#3}
\int_gdecr:N \g__arturo_nested_level_int
}
\cs_new_protected:Npn \__arturo_foreach_aux:NNnnn #1#2#3#4#5
{
\cs_set:Npn #1 ##1 ##2 {#5}
\seq_clear_new:N #2
\clist_map_inline:nn {#4}
{
\seq_set_split:Nnn #2 {#3} {##1}
#1 { \seq_item:Nn #2 } {##1}
}
}
\cs_generate_variant:Nn \__arturo_foreach_aux:NNnnn { cc }
\ExplSyntaxOff
\begin{document}
\ForEach{a,b,c,d}{#1\par}
\ForEach[/]{C/4/a/n,D/4/b/n,E/4/c/n}{#1{1} - #1{2} - #1{3} - #1{4} (from #2)\par}
\end{document}
Antwort2
Hier ist eine TeX-Lösung. Ich verstehe nicht genau, was Sie tun möchten, aber Sie können von hier aus beginnen.
\bgroup
\def\for#1\endfor{\def\body{#1}\iterate}
\def\iterate{\body\let\next=\iterate\else\let\next=\relax\fi\next}
\newcount\n
\n=0
% Example usage
\for
\advance\n by1
\number\n,
\ifnum\n<30
\endfor
\egroup
\bye
Rekursion und if-Anweisungen machen eine Programmiersprache Turing-vollständig.