所以这个问题是一个 tikz 问题!
假设您在 tikz 中的两个嵌套 foreach 循环内绘制事物,并且迭代器变量为\x
和\y
。 我想要获得的是能够指定一对列表,st 在我的两个嵌套循环内绘制时,如果与列表中的一对匹配,(x,y)
我可以应用一个预定义样式“A” ,否则应用样式“B”。(\x,\y)
关于如何获得这个,有什么想法吗?
简单的例子可以是下面的代码,它在一张纸上画 16 条线。我可能想要这样的条件:当\x
是偶数时,它应该使用样式“B”而不是样式“A”,但总的来说,我希望能够指定(\x,\y)
将使用样式“B”而不是“A”的特定对。
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[
A/.style={draw,color=red},
B/.style={draw,color=blue}
]
\foreach \x in {0,1,2,3} {
\foreach \y in {0,1,2,3} {
\draw[A] (2*\x,4*\y) -- (4*\y,3*\x);
}
}
\end{tikzpicture}
\end{document}
答案1
更新:使用 xstring
我原来的解决方案使用的stringstrings
包是极其慢。该软件包xstring
提供了相同的功能,语法更简洁,而且速度更快。
以下示例(使用xstring
)在我的机器中编译需要 0.902 秒。使用 的相同示例stringstrings
需要 16.575 秒!
这个例子与您在问题中发布的例子相同。
\documentclass{standalone}
\usepackage{xstring}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[
A/.style={draw,color=red},
B/.style={draw,color=blue}
]
\def\mylist{(0,1) (0,2) (0,3) (0,4) (2,1) (2,2) (2,3) (2,4)}
\foreach \x in {0,1,2,3} {
\foreach \y in {0,1,2,3} {
\IfSubStr{\mylist}{(\x,\y)}{\def\mystyle{B}}{\def\mystyle{A}}
\draw[\mystyle] (2*\x,4*\y) -- (4*\y,3*\x);
}
}
\end{tikzpicture}
\end{document}
原始答案:
使用包的一个简单解决方案stringstrings
(可能不适合处理列表,但在这种情况下它很容易使用并且能完成工作):
\documentclass{standalone}
\usepackage{stringstrings}
\usepackage{tikz}
\tikzset{
a/.style = {fill=yellow!20, ultra thick},
b/.style = {fill=black!20}
}
\def\mylist{(3,2) (2,1) (4,1)}
\begin{document}
\begin{tikzpicture}
\foreach \x in {1,...,4} {
\foreach \y in {1,...,3} {
\whereisword{\mylist}{(\x,\y)}
\ifnum\theresult=0\def\mystyle{b}\else\def\mystyle{a}\fi
\node[draw, circle, \mystyle] at (\x,\y) {\x,\y};
}
}
\end{tikzpicture}
\end{document}
结果: