
Estou tentando percorrer uma lista separada por vírgulas em um loop-repeat
ambiente. Mas todos os nomes das etiquetas são impressos de uma só vez e o número do ciclo é adicionado.
Como posso definir e vincular a lista de nomes de variáveis às vertentes de acordo? Tentei diversas variações, mas ainda sem sucesso.
\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}
Responder1
Sua proposta funciona, em princípio, mas há erros de sintaxe. Se você quiser uma matriz de strings, será necessário agrupar as entradas em "
. Então as entradas da matriz podem ser lidas com
\pgfmathsetmacro{\mc}{{\j}[\numexpr\x-2]}
que difere da sua expressão: você precisa de extra {
e }
e precisa acessar as entradas entre colchetes, e a primeira entrada tem índice 0, daí o \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}
Responder2
Posso propor uma expl3
solução baseada que evite peculiaridades \edef
ou \def
problemas com nomes de variáveis.
Nele \xloop
há um argumento opcional (ponto inicial, padrão 1), um argumento obrigatório para o ponto final e o código a ser executado, onde #1
se refere ao valor atual no loop. Um argumento opcional adicional para a etapa pode ser adicionado facilmente, se necessário.
O comando \listdefine
deve ser autoexplicativo; o comando \listextract
extrai o item solicitado da lista (índice a partir de 1); no segundo argumento \listextract
pode-se usar expressões 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}