我编写了一个程序\NewDocumentCommand
,可以生成垂直条,每个垂直条数值和标签文本是强制性的,颜色作为可选参数。还有一些全局参数(\startpoint
、\scalingfactor
、\bardistance
等\barwidth
)必须在使用命令之前指定\vbarchart
(请参阅 MWE)。这很有效。但是,我想知道是否有人知道如何以更具包容性的方式提示这些“预参数”?也许可以创建一个新环境并将它们作为预指定的选项。目前的方式是,我总是必须将这些参数复制到我想要使用的部分,这\vbarchart
没问题,但可能会做得更好。感谢任何帮助。
\documentclass{article}
\usepackage{tikz}
\usepackage{xparse}
\usetikzlibrary{math}
\NewDocumentCommand{\vbarchart}{m m O{black!5}}{
\tikzstyle{label1} = [align=center, above,pos=0.5]
\tikzstyle{label2} = [align=center, below,yshift=-3pt]
\draw[fill=#3] (\startpoint,0) --++(0,{#1*\scalingfactor}) --coordinate[pos=0.5](b1) node[label1,font=\percsize]{\pgfmathprintnumber[use comma]{#1}\Barunit} ++(\barwidth,0) -- ++(0,{-#1*\scalingfactor})coordinate(r1);
\tikzmath{\startpoint=\startpoint+\bardistance+\barwidth;}
\coordinate(h)(0,0);
\node[label2,font=\labelsize] at (h-|b1){#2};
\draw (-0.25,0) -- ([xshift=0.25cm]r1);
}
\begin{document}
\begin{tikzpicture}
\tikzmath{\startpoint=0;}
\tikzmath{\scalingfactor=0.25;}
\tikzmath{\bardistance=0.5;}
\tikzmath{\barwidth=1;}
\newcommand{\percsize}{\normalsize}
\newcommand{\labelsize}{\normalsize}
\newcommand{\Barunit}{\%}
\vbarchart{20}{Bar\\ One}
\vbarchart{5}{Bar\\ One}[red]
\vbarchart{15}{Bar\\ Two}
\vbarchart{5}{Bar\\ One}[blue]
\end{tikzpicture}
\end{document}
答案1
听起来像是一份工作pgfkeys
(见密钥管理在 pgf 手册中)。您可以使用\pgfqkeys
(或) 初始化键,然后使用语法\pgfkeys
将键设置为可选参数#3
。我在代码中用注释标记了我的编辑:\vbarchart
key1=value1,key2=value2,...
\documentclass{standalone}
\usepackage{tikz}
\usepackage{xparse}
\usepackage{pgfkeys} % Load the package
\usetikzlibrary{math}
\NewDocumentCommand{\vbarchart}{m m O{}}{
\pgfqkeys{/vbarchart}{% Define your keys - locally so that reset on every call of \vbarchart.
barfill/.initial=black!5,
percsize/.initial=\normalsize,
labelsize/.initial=\normalsize,
barunit/.initial=\%
}
\pgfqkeys{/vbarchart}{#3}% Set your keys according to the optional argument.
\tikzstyle{label1} = [align=center, above,pos=0.5]
\tikzstyle{label2} = [align=center, below,yshift=-3pt]
% Then use the keys with \pgfkeysvalueof{/vbarchart/key}
\draw[fill=\pgfkeysvalueof{/vbarchart/barfill}] (\startpoint,0) --++(0,{#1*\scalingfactor}) --coordinate[pos=0.5](b1) node[label1,font=\pgfkeysvalueof{/vbarchart/percsize}]{\pgfmathprintnumber[use comma]{#1}\pgfkeysvalueof{/vbarchart/barunit}} ++(\barwidth,0) -- ++(0,{-#1*\scalingfactor})coordinate(r1);
\tikzmath{\startpoint=\startpoint+\bardistance+\barwidth;}
\coordinate(h)(0,0);
\node[label2,font=\pgfkeysvalueof{/vbarchart/labelsize}] at (h-|b1){#2};
\draw (-0.25,0) -- ([xshift=0.25cm]r1);
}
\begin{document}
\begin{tikzpicture}
\tikzmath{\startpoint=0;}
\tikzmath{\scalingfactor=0.25;}
\tikzmath{\bardistance=0.5;}
\tikzmath{\barwidth=1;}
\vbarchart{20}{Bar\\ One}[barunit=$\mu$,percsize=\huge]
\vbarchart{5}{Bar\\ One}[barfill=red]
\vbarchart{15}{Bar\\ Two}[labelsize=\footnotesize,percsize=\footnotesize]
\vbarchart{5}{Bar\\ One}[barfill=blue]
\end{tikzpicture}
\end{document}
答案2
根据 Felix 的回答,我找到了我最初问题的最终解决方案。我使用了逻辑pgfkeys
并将它们包含在内\NewDocumentEnvironment
。这样,我现在可以输入需要指定不同于默认值的所需值,并且每次我想绘制条形图时都不必复制“常量定义”。现在只需在需要时将它们输入到环境定义中即可。
\documentclass{article}
\usepackage{tikz}
\usepackage{xparse}
\usepackage{pgfkeys}
\usetikzlibrary{shapes,shapes.geometric,arrows,fit,positioning,arrows.meta,angles,quotes,decorations.pathmorphing,decorations.shapes,decorations.text,calc,math}
\NewDocumentCommand{\vbarchart}{m m O{black!5}}{
\tikzstyle{label1} = [align=center, above,pos=0.5]
\tikzstyle{label2} = [align=center, below,yshift=-3pt]
\draw[fill=#3] (\startpoint,0) --++(0,{#1*\scalingfactor}) --coordinate[pos=0.5](b1) node[label1,font=\percsize]{\pgfmathprintnumber[use comma]{#1}\Barunit} ++(\barwidth,0) -- ++(0,{-#1*\scalingfactor})coordinate(r1);
\tikzmath{\startpoint=\startpoint+\bardistance+\barwidth;}
\coordinate(h)(0,0);
\node[label2,font=\labelsize] at (h-|b1){#2};
\draw (-0.25,0) -- ([xshift=0.25cm]r1);
}
\NewDocumentEnvironment{barchartenv}{O{}}
{\pgfqkeys{/barchartenv}{
scale/.initial=0.1,
bardis/.initial=0.75,
barwidth/.initial=0.75,
percsize/.initial=\normalsize,
labelsize/.initial=\normalsize,
barunit/.initial=\%}
\begin{tikzpicture}
\pgfqkeys{/barchartenv}{#1}
\tikzmath{\startpoint=0;}
\tikzmath{\scalingfactor=\pgfkeysvalueof{/barchartenv/scale};}
\tikzmath{\bardistance=\pgfkeysvalueof{/barchartenv/bardis};}
\tikzmath{\barwidth=\pgfkeysvalueof{/barchartenv/barwidth};}
\newcommand{\percsize}{\pgfkeysvalueof{/barchartenv/percsize}}
\newcommand{\labelsize}{\pgfkeysvalueof{/barchartenv/labelsize}}
\newcommand{\Barunit}{\pgfkeysvalueof{/barchartenv/barunit}}}
{\end{tikzpicture}}
\begin{document}
\begin{barchartenv}[scale=0.1,bardis=1,barwidth=1,percsize=\small,labelsize=\large,barunit={} Awnsers]
\vbarchart{25}{One}
\vbarchart{5}{Two}[red!50]
\vbarchart{20}{Three}
\vbarchart{35}{Four}[blue!50]
\end{barchartenv}
\end{document}