![在循环重复环境中循环遍历逗号分隔列表](https://linux22.com/image/423783/%E5%9C%A8%E5%BE%AA%E7%8E%AF%E9%87%8D%E5%A4%8D%E7%8E%AF%E5%A2%83%E4%B8%AD%E5%BE%AA%E7%8E%AF%E9%81%8D%E5%8E%86%E9%80%97%E5%8F%B7%E5%88%86%E9%9A%94%E5%88%97%E8%A1%A8.png)
我尝试在loop-repeat
环境中循环浏览逗号分隔的列表。但所有标签名称都会一次打印出来,并且会添加循环编号。
我该如何定义变量名列表并将其链接到相应的链?我尝试了几种变化,但尚未成功。
\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}
答案1
您的建议原则上可行,但存在语法错误。如果您想要一个字符串数组,则需要将条目包装在 中"
。然后可以使用以下方式读取数组条目
\pgfmathsetmacro{\mc}{{\j}[\numexpr\x-2]}
这与您的表达不同:您需要额外的{
和}
,并且您需要使用方括号访问条目,并且第一个条目的索引为 0,因此为\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}
答案2
我可以提出一个expl3
基于解决方案的解决方案,以避免出现\edef
或\def
变量名称相关的问题。
其中\xloop
有一个可选参数(起点,默认为 1)、一个强制参数(终点)和要执行的代码,其中#1
指的是循环中的当前值。如果需要,可以轻松添加步骤的另一个可选参数。
该命令\listdefine
应该是不言自明的;该命令\listextract
从列表中提取请求的项目(索引从 1 开始);在第二个参数中\listextract
可以使用算术表达式。
\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}