我有一些宏可以帮我执行浮点查找和计算,我对绘制它们的结果很感兴趣。它们是那种需要 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
- 这会导致垂直空白更少。我只想将所有内容放在一页上;这与问题无关。