![pgfkeys 并以数学格式传递参数](https://linux22.com/image/460686/pgfkeys%20%E5%B9%B6%E4%BB%A5%E6%95%B0%E5%AD%A6%E6%A0%BC%E5%BC%8F%E4%BC%A0%E9%80%92%E5%8F%82%E6%95%B0.png)
似乎 pgfkeys 正在尝试对我的一个参数进行数学运算,但失败了,因为它实际上不是数学运算。我该如何防止这种情况并确保正确传递参数?
使用 lualatex 进行编译。日志记录了单个Missing number, treated as zero.
,然后
Package PGF Math Error: You've asked me to divide `1' by `', but I cannot divide any number by `' (in '(0) + (1/, 1/A, 1/-1 B, 1/-2 C,)').
我尝试了几种不同的方法,将 {} 放在事物周围,并代替空文本等等。这可能与有关sum=auto
,但只需输入文本即可,因此 pgfkeys 中仍有一些变化。
MWE 如下:
\documentclass[twoside,headings,a4paper]{article}
\usepackage{xparse}
\usepackage{pgfkeys}
\usepackage{pgf-pie}
\begin{document}
\pgfkeys{
/TestExample/.is family, TestExample,
% Here are the options that a user can pass
default/.style = {
TestPie = {},
},
TestPie/.store in = \TestPie,
}
\newcommand{\TestExample}[2][]{
\clearpage
\pgfkeys{TestExample, default, #1}%
\begin{tikzpicture}
\pie[color=white, hide number, text=inside, sum=auto, rotate=90, change direction]{
1/,
1/A,
1/-1 B,
1/-2 C
}
\end{tikzpicture}
\begin{tikzpicture}
\pie[color=white, hide number, text=inside, sum=auto, rotate=90, change direction]{
\TestPie
}
\end{tikzpicture}
#2
}
\TestExample[TestPie={
1/,
1/A,
1/-1 B,
1/-2 C
}]{
Blah Blah Blah
}
\end{document}
答案1
您的\TestPie
意愿将被放在列表的位置,例如
\foreach \foo/\bar in {\TestPie} {<body>}
并且由于列表的第一个(也是唯一一个)元素\TestPie
不包含,因此/
它将让\foo
和\bar
都变为\TestPie
。
第一个函数会在某个时刻被抛出到 PGFMath 中,它会尝试计算公式的展开式\TestPie
——PGFMath 总是会完全展开公式——做包含 a/
并且 PGFMath 尝试划分 ... 事物。
\TestPie
您至少需要扩展一次。
最简单的方法是
\def\temp{\pie[color=white, hide number, text=inside,
sum=auto, rotate=90, change direction]}
\expandafter\temp\expandafter{\TestPie}
另一个答案显示了一些基于 e-TeX 的方法。
但是,您也可以\foreach
通过启用
/pgf/foreach/expand list
这将导致 PGFFor充分扩张全部\pie
列表,然后再对其进行迭代 - 或者至少在将其提供给可选参数时使用的列表\pie
:
\pie[color=white, hide number, text=inside,
sum=auto, rotate=90, change direction, /pgf/foreach/expand list]
{\TestPie}
\textbf
这对于像饼图标签内部那样的脆弱命令来说并不安全。
但请允许我进行扩展expand list
,以便它确实接受 - 此外true
-false
然后once
你可以做
\pie[color=white, hide number, text=inside,
sum=auto, rotate=90, change direction, /pgf/foreach/expand list=once]
{\TestPie}
相当安全。
(是的,这将扩展所使用的每个 PGFFor 循环的第一个标记\pie
。)
代码
\documentclass[twoside,headings,a4paper]{article}
\usepackage{xparse}
\usepackage{pgfkeys}
\usepackage{pgf-pie}
\makeatletter
\pgfqkeys{/pgf/foreach/expand list}{
.code=\csname pgffor@expand@list@#1\endcsname,
.default=true}
\def\pgffor@expand@list@once{%
\def\pgffor@expand@list##1{%
\expandafter\def\expandafter##1\expandafter}}
\makeatother
\begin{document}
\pgfkeys{
/TestExample/.is family, TestExample,
% Here are the options that a user can pass
default/.style = {
TestPie = {},
},
TestPie/.store in = \TestPie,
}
\newcommand{\TestExample}[2][]{%
\clearpage
\pgfkeys{TestExample, default, #1}%
\begin{tikzpicture}
\pie[color=white, hide number, text=inside,
sum=auto, rotate=90, change direction]{
1/,
1/A,
1/-1 B,
1/-2 C
}
\end{tikzpicture}
\begin{tikzpicture}
\def\temp{\pie[color=white, hide number, text=inside,
sum=auto, rotate=90, change direction]}
\expandafter\temp\expandafter{\TestPie}
\end{tikzpicture}
\begin{tikzpicture}
\pie[color=white, hide number, text=inside,
sum=auto, rotate=90, change direction, /pgf/foreach/expand list=once]
{\TestPie}
\end{tikzpicture}
#2}
\TestExample[
TestPie={
1/,
1/A,
1/-1 B,
1/-2 \textbf{C}
}]{Blah Blah Blah}
\end{document}
答案2
您需要在尝试解析其参数\TestPie
之前扩展其值。作为习惯用法,您可以使用pgf-pie
\expanded{\unexpanded{<stuff>}\expandafter}
考虑之前使用一步扩展<stuff>
。这可以用来扩展你的宏一次。
如果需要多次使用或者希望其语义更清晰,可以定义一个宏:
\newcommand\expandafterthings[1]{\expanded{\unexpanded{#1}\expandafter}}
因此您的调用\pie
可能如下所示:
\expandafterthings
{\pie[color=white, hide number, text=inside, sum=auto, rotate=90, change direction]}\expandafter{\TestPie}
如果你知道这一点\TestPie
,并且你所有的选择对于全面扩张都是安全的,你也可以使用
\expanded{\noexpand\pie[<options>]{\TestPie}}
答案3
以下答案使用轮图包,是我写的。
下面的答案中没有出现所描述的问题。
\documentclass[border=6pt]{standalone}
\usepackage{wheelchart}
\begin{document}
\pgfkeys{
/TestExample/.is family,
TestExample,
% Here are the options that a user can pass
default/.style={TestPie={},},
TestPie/.store in=\TestPie,
}
\newcommand{\TestExample}[2][]{%
%\clearpage
\pgfkeys{TestExample,default,#1}%
\pgfkeys{
/wheelchart,
data=,
pie,
slices style={
fill=none,
draw
},
wheel data=\WCvarB
}%
\begin{tikzpicture}
\wheelchart{1/,1/A,1/-1 B,1/-2 C}
\end{tikzpicture}
\begin{tikzpicture}
\wheelchart{\TestPie}
\end{tikzpicture}
#2}
\TestExample[TestPie={1/,1/A,1/-1 B,1/-2 \textbf{C}}]{Blah Blah Blah}
\end{document}