条件 tikz 节点填充

条件 tikz 节点填充

我有一张 5 段 tikz 图片,想要将其包含在一个\newcommand带参数的图片中,该参数决定填充了多少段。

这是我的 MWE:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning,shapes}

\begin{document}
\begin{tikzpicture}[baseline=-0.5ex]
    \tikzstyle{every node}=[signal, signal to=east, draw=gray, minimum height=.9em, minimum width=2mm];
    \node (1) {};
    \node[signal from=west, right=0pt of 1] (2) {};
    \node[signal from=west, right=0pt of 2] (3)  {};
    \node[signal from=west, right=0pt of 3] (4) {};
    \node[signal from=west, signal to=0, right=0pt of 4] (5) {};
\end{tikzpicture}
\end{document}

编译后如下所示:

在此处输入图片描述

在此处输入图片描述

我尝试添加\def\myNumber{#1}\newcommand\myCommand[1]并添加\ifnum\myNumber>0 fill=black \fi到节点参数,但一直收到错误。

答案1

在此处输入图片描述

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning,shapes}

\begin{document}
\newcommand\zz[1]{%
\begin{tikzpicture}[baseline=-0.5ex]
    \tikzstyle{every node}=[signal, signal to=east, draw=gray, minimum height=.9em, minimum width=2mm];
    \node[fill=\ifnum#1>0 black\else white\fi] (1) {};
    \node[fill=\ifnum#1>1 black\else white\fi,signal from=west, right=0pt of 1] (2) {};
    \node[fill=\ifnum#1>2 black\else white\fi,signal from=west, right=0pt of 2] (3)  {};
    \node[fill=\ifnum#1>3 black\else white\fi,signal from=west, right=0pt of 3] (4) {};
    \node[fill=\ifnum#1>4 black\else white\fi,signal from=west, signal to=0, right=0pt of 4] (5) {};
\end{tikzpicture}}

\zz{0}

\zz{1}

\zz{2}

\zz{3}

\zz{4}

\zz{5}

\end{document}

答案2

使用 key/val 接口的简单方法:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning,shapes}

\newcommand{\mycommand}[2][]{
    \begin{tikzpicture}[
        draw=gray,
        baseline=-0.5ex,
        every node/.style={
            draw,
            signal, signal to=east,
            minimum height=.9em, minimum width=2mm
          },
        progress/.style={segment ##1/.style={fill}},
        progress/.list={#2},
        #1,
    ]

    \node[segment 1/.try] (1) {};
    \node[signal from=west, right=0pt of 1,segment 2/.try] (2) {};
    \node[signal from=west, right=0pt of 2,segment 3/.try] (3)  {};
    \node[signal from=west, right=0pt of 3,segment 4/.try] (4) {};
    \node[signal from=west, signal to=0, right=0pt of 4,segment 5/.try] (5) {};
    \end{tikzpicture}
}

\newcommand{\myprogress}[2][]{\mycommand[#1]{0,...,#2}}

\begin{document}
    \mycommand{}\par
    \mycommand{1,...,5}\par
    \mycommand[fill=red]{1,3,5}\par
    \mycommand[draw=blue]{2,...,5}\par
    \mycommand{4}\par
    \myprogress{4}\par
\end{document}

\mycommand宏允许您提供要填充的段列表,只需\myprogress将它们填充到提供的数字即可。可选参数是常规 tikz 键/值列表,因此您可以通过设置fill=color或非常自然地自定义颜色draw=color

预览

解释

这个想法是为 1 到 5 的每个段设置一个键segment N。如果该段没有任何事情要做,则键为空,fill如果该段需要填充,则设置为。因此节点样式现在包含segment N但我添加了/.try,以便 TikZ 在没有定义键的情况下简单地忽略该键。这样,当这些键应该没有效果时,我们就不必为它们给出简单的定义。

现在我们想segment N以一种简单的方式设置键,即使用列表语法。首先,我们提供一个辅助键progress=N,其效果是设置segment Nfill。然后,我们使用该实用程序对作为参数提供的列表的每个项目/.list执行键( )。最后,我们以键/值列表的形式执行,以便可选参数中的键可以覆盖当前范围。progress=KK#2#1

最后一步:我们在样式之外设置绘制颜色every node,以便将其设置为整个图片的默认颜色,every node现在样式只需要draw操作而不指定颜色,以便实际颜色可以被参数覆盖#1(如果需要)。

概括

如果您想使宏的定义不那么临时,您可以将其概括为 N 个段(这里 N 是第一个强制参数),并使用它chains来定位这些段。

笔记:我设置node distance-\pgflinewidth,以便边框在段边界处的宽度不会加倍。

\usetikzlibrary{chains}

\newcommand{\mycommand}[3][]{
    \begin{tikzpicture}[
        draw=gray,
        baseline=-0.5ex,
        every node/.style={
            draw,
            signal, signal to=east,
            minimum height=.9em, minimum width=2mm
          },
        progress/.style={segment ##1/.style={fill}},
        progress/.list={#3},
        start chain,
        node distance = -\pgflinewidth,
        #1,
    ]

    \node[on chain,segment 1/.try] {};
    \ifnum#2>2
    \pgfmathsetmacro{\N}{#2-1}
    \foreach \K in {2,...,\N}{
        \node[on chain,signal from=west, segment \K/.try] {};
    }
    \fi
    \node[on chain,signal from=west, signal to=0,segment #2/.try] {};
    \end{tikzpicture}
}

预览2

答案3

还有另一个提议……

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning,shapes,calc}
\newcounter{instances} % introduced to avoid giving two different nodes the same name
\newcommand{\mycommand}[1]{\stepcounter{instances}
    \ifnum#1=0
    \node (\theinstances-1) {};
    \else
    \node[fill=black] (\theinstances-1) {};
    \fi
    \foreach \i in {1,...,4}
    {
    \pgfmathtruncatemacro{\j}{\i+1}
    \pgfmathtruncatemacro{\k}{min(-\i+#1,1)*100}
    \node[signal from=west, right=0pt of \theinstances-\i,fill=black!\k!white]
    (\theinstances-\j) {};
    }
}   

\begin{document}
\begin{tikzpicture}[baseline=-0.5ex]
    \tikzstyle{every node}=[signal, signal to=east, draw=gray, minimum height=.9em, minimum width=2mm];
    \foreach \f in {0,...,5}
    {\begin{scope}[yshift=-\f cm]
    \mycommand{\f}
    \end{scope}}
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案4

以下答案使用轮图包,是我写的。

切片之间的间隙是通过键获得的gap polar

切片 1 的末尾有箭头,但开头没有。因此slices end arrow{1}={1}{0}使用密钥。

切片 2、3 和 4 在开始和结束处都有箭头。因此slices arrow{2,3,4}={1}{0}使用密钥。

切片 5 在开始处有箭头,但在结束处没有。因此slices start arrow{5}={-1}{0}使用键。

切片的样式由键决定slices style。对于从 0 到 参数的切片\myCommand,样式由键指定slices style{0,...,#1}。这里\WClistcolors指的是列表中给予键的项目WClistcolors

切片的数量由键决定total count

条形是通过键获得的xbar

在此处输入图片描述

\documentclass[border=6pt,varwidth]{standalone}
\usepackage{wheelchart}
\newcommand{\myCommand}[1]{\begin{tikzpicture}
\wheelchart[
  gap polar=0.1,
  slices end arrow{1}={1}{0},
  slices arrow{2,3,4}={1}{0},
  slices start arrow{5}={-1}{0},
  slices style={fill=none,draw=gray,ultra thick},
  slices style{0,...,#1}={\WClistcolors,draw=gray,ultra thick},
  total count=5,
  xbar={7}{1},
  WClistcolors={green!50!black,green,yellow,orange,red}
]{}
\end{tikzpicture}}
\begin{document}
\myCommand{0}\\
\myCommand{1}\\
\myCommand{2}\\
\myCommand{3}\\
\myCommand{4}\\
\myCommand{5}
\end{document}

相关内容