绘制用 \pgfmathdeclarefunction 定义的函数

绘制用 \pgfmathdeclarefunction 定义的函数

我有一些宏可以帮我执行浮点查找和计算,我对绘制它们的结果很感兴趣。它们是那种需要 if/else 的计算,因此不能轻易地将它们写成简单的数学公式\addplot。感谢之前的一个问题 (使用 PGFPlots 绘制宏结果),我现在知道使用\pgfmathdeclarefunction,但尝试之后我发现 似乎addplot在将值作为函数参数传递之前在其前面添加“0Y”或“1Y”。我的外部宏无法处理这些额外的文本,我不确定它为什么在那里。

在测试过程中,我还发现调用定义的函数pgfmathdeclarefunction也可以改变图形的位置......

\documentclass{article}

\usepackage{xparse}

\usepackage{pgfplots}
\pgfplotsset{compat=1.10}

\begin{document}

% Example of a macro which does math outside of pgf
    \ExplSyntaxOn
    \DeclareExpandableDocumentCommand \doubleMacro { m }%
     {%
      \fp_eval:n { #1*2 }%Math performed by a package other than pgfplots
     }%
    \ExplSyntaxOff  

%Demo: macro does work in regular text
\doubleMacro{1.1}.
    
% Defining custom pgf functions for plotting

    \pgfmathdeclarefunction{mathDoubleMacro}{1}{%
        \pgfmathparse{\doubleMacro{#1}} %Calls macro which performs math done by another package
    }
    
    \pgfmathdeclarefunction{mathDoublePgf}{1}{%
        \pgfmathparse{#1*2} %Uses pgf to do the same thing as an external macro could
    }

%Generic plot with function given directly to \addplot
\begin{center}
\begin{tikzpicture}
    \begin{axis}
        \addplot[domain=0:1] {2*x};
    \end{axis}
\end{tikzpicture}
\end{center}

%Plot using first macro: complains about 'Unknown fp word Y.'
\begin{center}
\begin{tikzpicture}
    \begin{axis}
        %\addplot[domain=0:1] {mathDoubleMacro(x)};%Commented out because it gives problems
    \end{axis}
\end{tikzpicture}
\end{center}

%Plot using second macro: works, but graph is displaced to the right of the expected position
\begin{center}
\begin{tikzpicture}
    \begin{axis}
        \addplot[domain=0:1] {mathDoublePgf(x)};
    \end{axis}
\end{tikzpicture}
\end{center}

\end{document}

如果我定义为调用不存在的宏,那么错误会显示试图评估 ymathDoubleMacro的 x 值:addplot

  • 0Y0.0e0
  • 1Y4.1666e-2
  • 1Y8.3332e-2
  • ...
  • 1Y9.9998401e-1

这些 nY 到底是什么,为什么要\addplot[domain=0:1] {mathDoublePgf(x)}给出具有不同定位的图表?

答案1

第一个问题,奇怪的Y字符可以被认为是 pgfplots 的一个缺陷。事实上,这是“过早优化”的结果:pgfplots 在内部使用这种格式以规范化形式表示浮点数 - 并且它不会将其转换回 IEEE 数字。考虑一下,我相信它应该会产生正确的数字。

无论如何,目前的解决方案是申请\pgfmathfloatvalueof{#1}将数字转换为“正常”表示形式。

这直接导致了第二个问题,即虚假空格。它们来自函数求值后的空白,并且存在于两个都宏定义:直接在\pgfmathparse{\doubleMacro{#1}}和 之后\pgfmathparse{#1*2} %。这是 TeX 的奇怪之处之一。通常情况下,TikZ 会吞掉这些虚假字符 - 我不知道为什么在这种情况下它不会这样做。解决方案是通过直接在 之后添加来删除虚假空格%

同时使用这两件物品可以修复你的身材。

\documentclass{article}

\usepackage{xparse}

\usepackage{pgfplots}
\pgfplotsset{compat=1.10}

\begin{document}

% Example of a macro which does math outside of pgf
    \ExplSyntaxOn
    \DeclareExpandableDocumentCommand \doubleMacro { m }%
     {%
      \fp_eval:n { #1*2 }%Math performed by a package other than pgfplots
     }%
    \ExplSyntaxOff  

%Demo: macro does work in regular text
\doubleMacro{1.1}.

% Defining custom pgf functions for plotting

    \pgfmathdeclarefunction{mathDoubleMacro}{1}{%
        \pgfmathparse{\doubleMacro{\pgfmathfloatvalueof{#1}}}%Calls macro which performs math done by another package
    }

    \pgfmathdeclarefunction{mathDoublePgf}{1}{%
        \pgfmathparse{#1*2}%Uses pgf to do the same thing as an external macro could
    }

    \centering

%Generic plot with function given directly to \addplot
\begin{tikzpicture}
    \begin{axis}
        \addplot[domain=0:1] {2*x};
    \end{axis}
\end{tikzpicture}

%Plot using first macro: complains about 'Unknown fp word Y.'
\begin{tikzpicture}
    \begin{axis}
        \addplot[domain=0:1] {mathDoubleMacro(x)};%Commented out because it gives problems
    \end{axis}
\end{tikzpicture}


%Plot using second macro: works, but graph is displaced to the right of the expected position
\begin{tikzpicture}
    \begin{axis}
        \addplot[domain=0:1] {mathDoublePgf(x)};
    \end{axis}
\end{tikzpicture}

\end{document}

在此处输入图片描述

请注意,我替换了\begin{center}...\end{center}一个\centering- 这会导致垂直空白更少。我只想将所有内容放在一页上;这与问题无关。

相关内容