更新:使用 xstring

更新:使用 xstring

所以这个问题是一个 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}

结果:

结果

相关内容