我尝试用以下代码编写一个简单的条形图环境pgf图以减少所需的标记。为此,我使用环境包裹。
由于某种原因,tikz 抱怨所提供的坐标存在格式错误。
梅威瑟:
\documentclass[varwidth=true, border=2pt]{standalone}
\usepackage{pgfplots}
\usepackage{environ}
\NewEnviron{barplot}{%
\begin{tikzpicture}
\begin{axis}[
symbolic x coords={A, B, C},
xtick=data,
ymax=40,
ymajorgrids=true
]
\addplot[ybar,fill=gray] coordinates {
\BODY
};
\end{axis}
\end{tikzpicture}
}
\begin{document}
\begin{barplot}
(A, 10)(B, 20)(C, 30)
\end{barplot}
\end{document}
答案1
如果老年人pgfplots
想要看到扩展的坐标列表而不是宏中的坐标列表,那么可以使用许多\expandafter
或以下方式进行扩展:
\documentclass[varwidth=true, border=2pt]{standalone}
\usepackage{pgfplots}
\usepackage{environ}
\NewEnviron{barplot}{%
\begin{tikzpicture}
\begin{axis}[
symbolic x coords={A, B, C},
xtick=data,
ymax=40,
ymajorgrids=true
]
\edef\processme{%
\noexpand\addplot[ybar,fill=gray] coordinates {
\BODY
};%
}\processme
\end{axis}
\end{tikzpicture}% comment to remove unwanted space
}
\begin{document}
\begin{barplot}
(A, 10)(B, 20)(C, 30)
\end{barplot}
\end{document}
的更好变体egreg
,它不会扩展单元格条目:
\documentclass[varwidth=true, border=2pt]{standalone}
\usepackage{pgfplots}
\usepackage{environ}
\NewEnviron{barplot}{%
\def\process##1{%
\addplot[ybar, fill=gray] coordinates {##1};
}%
\begin{tikzpicture}
\begin{axis}[
symbolic x coords={A, B, C},
xtick=data,
ymax=40,
ymajorgrids=true
]
\expandafter\process\expandafter{\BODY}
\end{axis}
\end{tikzpicture}%
}
\begin{document}
\begin{barplot}
(A, 10)(B, 20)(C, 30)
\end{barplot}
\end{document}
除了 之外\BODY
,包environ
还提供了以下接口\collect@body
:
\documentclass[varwidth=true, border=2pt]{standalone}
\usepackage{pgfplots}
\usepackage{environ}
\makeatletter
\newenvironment{barplot}{%
\collect@body\process@barplot
}{}
\def\process@barplot#1{%
\begin{tikzpicture}
\begin{axis}[
symbolic x coords={A, B, C},
xtick=data,
ymax=40,
ymajorgrids=true
]
\addplot[ybar, fill=gray] coordinates {#1};
\end{axis}
\end{tikzpicture}%
}
\makeatother
\begin{document}
\begin{barplot}
(A, 10)(B, 20)(C, 30)
\end{barplot}
\end{document}
作为打击乐器说,使用pgfplots
v1.12 和 TikZ v3.0,不需要扩展技巧。