我有一张 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 N
为fill
。然后,我们使用该实用程序对作为参数提供的列表的每个项目/.list
执行键( )。最后,我们以键/值列表的形式执行,以便可选参数中的键可以覆盖当前范围。progress=K
K
#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}
}
答案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}