
Estoy intentando recorrer una lista separada por comas en un loop-repeat
entorno. Pero todos los nombres de las etiquetas se imprimen a la vez y se agrega el número de ciclo.
¿Cómo puedo definir y vincular la lista de nombres de variables a las cadenas en consecuencia? Probé varias variaciones pero aún no tuve éxito.
\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}
Respuesta1
Su propuesta funciona, en principio, pero hay errores de sintaxis. Si desea una matriz de cadenas, debe envolver las entradas en formato "
. Entonces las entradas de la matriz se pueden leer con
\pgfmathsetmacro{\mc}{{\j}[\numexpr\x-2]}
que difiere de su expresión: necesita extra {
y }
y necesita acceder a las entradas entre corchetes, y la primera entrada tiene índice 0, de ahí el \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}
Respuesta2
Puedo proponer una expl3
solución basada que evite peculiaridades con \edef
o \def
y también problemas con los nombres de las variables.
Hay \xloop
un argumento opcional (punto de inicio, predeterminado 1), uno obligatorio para el punto final y el código a ejecutar, donde #1
se refiere al valor actual en el bucle. Se puede agregar fácilmente otro argumento opcional para el paso, si lo necesita.
La orden \listdefine
debe explicarse por sí misma; el comando \listextract
extrae el elemento solicitado de la lista (índice que comienza en 1); en el segundo argumento \listextract
se pueden utilizar expresiones aritméticas.
\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}