\NewDocumentCommand 的预定义和稳定参数

\NewDocumentCommand 的预定义和稳定参数

我编写了一个程序\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。我在代码中用注释标记了我的编辑:\vbarchartkey1=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}

相关内容