pgfkeys 并以数学格式传递参数

pgfkeys 并以数学格式传递参数

似乎 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}

相关内容