
Ich versuche, in einer loop-repeat
Umgebung 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.
\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}
Antwort2
Ich kann eine expl3
fundierte Lösung vorschlagen, die Macken mit \edef
oder \def
sowie Probleme im Zusammenhang mit Variablennamen vermeidet.
Darin \xloop
sind ein optionales Argument (Startpunkt, Standard 1), ein obligatorisches Argument für den Endpunkt und der auszuführende Code enthalten, wobei #1
sich 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 \listdefine
sollte selbsterklärend sein; der Befehl \listextract
extrahiert das angeforderte Element aus der Liste (Index beginnend bei 1); im zweiten Argument \listextract
kö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}