Durch Kommas getrennte Liste in einer Loop-Repeat-Umgebung durchlaufen

Durch Kommas getrennte Liste in einer Loop-Repeat-Umgebung durchlaufen

Ich versuche, in einer loop-repeatUmgebung eine durch Kommas getrennte Liste durchzugehen. Es werden jedoch alle Etikettennamen auf einmal gedruckt und die Zyklusnummer wird hinzugefügt.

Wie kann ich die Liste der Variablennamen entsprechend definieren und mit den Strängen verknüpfen? Ich habe mehrere Varianten ausprobiert, bisher jedoch ohne Erfolg.

Bildbeschreibung hier eingeben

\documentclass[tikz,border=5mm]{standalone}
%\documentclass[convert={density=1200,size=4320x3200,outext=.png}]{standalone}
\usepackage{tikz}
\usetikzlibrary{arrows}
\usetikzlibrary{knots}
%
\begin{document}
\begin{tikzpicture}[scale=1.0,>=latex']
%
\draw[fill=white] (0,0) rectangle (5,6);
%
\begin{knot}[ %draft mode=crossings,
clip width=5,
clip radius=6pt]
%
\def\j{$unused$,$\alpha$,$\beta$,$\gamma$}
\edef\x{1}
\loop
\edef\x{\the\numexpr\x+1}
\strand [red,->]
    (1,\x) coordinate (w\x) -- coordinate (e\x)(4,\x) node[anchor=left,above,at start]{\j{\x}};
\ifnum\x<4\repeat
%
\strand [thick,->] (2,1) -- (2,5);
\strand [thick,->] (3,1) -- (3,5);
%\flipcrossings {2}
\end{knot}
%
\end{tikzpicture}
\end{document}

Antwort1

Ihr Vorschlag funktioniert im Prinzip, enthält aber Syntaxfehler. Wenn Sie ein Array von Zeichenfolgen möchten, müssen Sie die Einträge in umschließen ". Anschließend können die Array-Einträge mit ausgelesen werden.

\pgfmathsetmacro{\mc}{{\j}[\numexpr\x-2]}

was sich von Ihrem Ausdruck unterscheidet: Sie benötigen zusätzliche {und }, und Sie müssen auf die Einträge mit eckigen Klammern zugreifen, und der erste Eintrag hat den Index 0, daher das \numexpr\x-1.

\documentclass[tikz,border=5mm]{standalone}
%\documentclass[convert={density=1200,size=4320x3200,outext=.png}]{standalone}
\usepackage{tikz}
\usetikzlibrary{arrows}
\usetikzlibrary{knots}
%
\begin{document}
\begin{tikzpicture}[scale=1.0,>=latex']
%
\draw[fill=white] (0,0) rectangle (5,6);
%
\begin{knot}[ %draft mode=crossings,
clip width=5,
clip radius=6pt]
%
\def\j{"$\alpha$","$\beta$","$\gamma$"}
\edef\x{1}
\loop
\edef\x{\the\numexpr\x+1}
\strand [red,->]
    (1,\x) coordinate (w\x) -- coordinate (e\x)(4,\x) 
    node[anchor=left,above,at start]{\pgfmathsetmacro{\mc}{{\j}[\numexpr\x-2]}%
    \mc};
\ifnum\x<4\repeat
%
\strand [thick,->] (2,1) -- (2,5);
\strand [thick,->] (3,1) -- (3,5);
%\flipcrossings {2}
\end{knot}
%
\end{tikzpicture}
\end{document}

Bildbeschreibung hier eingeben

Antwort2

Ich kann eine expl3fundierte Lösung vorschlagen, die Macken mit \edefoder \defsowie Probleme im Zusammenhang mit Variablennamen vermeidet.

Darin \xloopsind ein optionales Argument (Startpunkt, Standard 1), ein obligatorisches Argument für den Endpunkt und der auszuführende Code enthalten, wobei #1sich auf den aktuellen Wert in der Schleife bezieht. Ein weiteres optionales Argument für den Schritt kann bei Bedarf einfach hinzugefügt werden.

Der Befehl \listdefinesollte selbsterklärend sein; der Befehl \listextractextrahiert das angeforderte Element aus der Liste (Index beginnend bei 1); im zweiten Argument \listextractkönnen arithmetische Ausdrücke verwendet werden.

\documentclass{article}
%\usepackage{xparse} % not needed for LaTeX 2020-10-01 or later
\usepackage{tikz}
\usetikzlibrary{arrows}
\usetikzlibrary{knots}

\ExplSyntaxOn
% looping through integers
\NewDocumentCommand{\xloop}{O{1}mm}
 {
  \int_step_inline:nnn { #1 } { #2 } { #3 }
 }
% define lists
\NewDocumentCommand{\listdefine}{mm}
 {
  \clist_clear_new:c { l_nivek_list_#1_clist }
  \clist_set:cn { l_nivek_list_#1_clist } { #2 }
 }
% extracting items from lists
\NewExpandableDocumentCommand{\listelement}{mm}
 {
  \clist_item:cn { l_nivek_list_#1_clist } { #2 }
 }
\ExplSyntaxOff

\begin{document}
\begin{tikzpicture}[scale=1.0,>=latex']

\draw[fill=white] (0,0) rectangle (5,6);

\begin{knot}[ %draft mode=crossings,
  clip width=5,
  clip radius=6pt
]
%
\listdefine{j}{$\alpha$,$\beta$,$\gamma$}
\xloop[2]{4}{
  \strand [red,->]
    (1,#1) coordinate (w#1) -- coordinate (e#1)(4,#1) 
     node[anchor=left,above,at start]{\listelement{j}{#1-1}};
}
%
\strand [thick,->] (2,1) -- (2,5);
\strand [thick,->] (3,1) -- (3,5);
\end{knot}
%
\end{tikzpicture}

\end{document}

Bildbeschreibung hier eingeben

verwandte Informationen