怎么了我将 samples 参数与\pgfmathdeclarefunction
?结合使用。
最低限度的违规示例如下:
\documentclass{article}
\usepackage{tikz}
\usepackage{pgfplots}
\begin{document}
\pgfmathdeclarefunction{myfunc}{1}{\pgfmathparse{ sin(#1) } }
\begin{tikzpicture}[]
\begin{axis}[ domain=0:360, samples=100]
\addplot +[thick] { myfunc(x) };
\end{axis}
\end{tikzpicture}
\end{document}
令人疯狂的是,改变 samples 参数的值会导致图片向右移动。
如果我编辑最小示例,samples=10
我会得到
现在,更令人吃惊的是:如果我删除\pgfmathdeclarefunction
函数声明并直接使用正弦绘制,如下所示
\addplot +[thick] { sin(x) };
样本的转移效应已经消失。
当然,在这个简单的情况下使用函数声明似乎有些肤浅 - 但这只是最小的违规示例。原始文档要大得多,包含大约 15 个函数声明,并且没有提供直接绘图的功能。
目前我有一个解决方法,就是放置
\hspace*{-10cm}
在tizpicture之前,根据samples参数的设置缩放空间。
然而,我认为这更可能是 tikz 解析器中存在一些特殊的错误(或者我的一些奇怪的误解)。
有什么想法可以更好地解决这个问题吗?
补充观察:在我进一步对原始文档进行实验后,我发现在绘图过程中调用的每个函数声明都会增加一些额外的水平空间。由于原始文档中的嵌套是高度动态的,因此它实际上使得 Tikz 的使用变得不可行,因为我事先不知道所需的水平校正。
第一个解决方案看起来,一个部分解决方法是删除 \pgfmathdeclarefunction 主体中的任何额外空白。该解决方案还证实了解析器中存在一些错误。
答案1
\pgfmathdeclarefunction{myfunc}{1}{\pgfmathparse{ sin(#1) } }
包含 主体内的空格\pgfmathdeclarefunction
看起来这些空格在某种程度上导致了移位。与samples
属性的联系是巧合,因为它会影响调用定义的次数。 内部的空格\pgfmathparse
似乎不会影响位置。
解决方法:移除空白。
使固定:错误问题已发送给 github 的 tikz 维护人员。
答案2
在 Git 版本的 PGF(未来 3.1.6)中,您可以设置/pgf/declare function/ignore spaces=true
忽略用 定义的函数主体中的所有空格\pgfmathdeclarefunction
。我不建议全局启用此功能,或者在您启用后立即将其关闭,因为这可能会破坏其他功能。
\documentclass{article}
\usepackage{tikz}
\usepackage{pgfplots}
\begin{document}
\pgfkeys{/pgf/declare function/ignore spaces=true}
\pgfmathdeclarefunction{myfunc}{1}{\pgfmathparse{ sin(#1) } }
\pgfkeys{/pgf/declare function/ignore spaces=false}
\begin{tikzpicture}[]
\begin{axis}[ domain=0:360, samples=100]
\addplot { myfunc(x) };
\end{axis}
\end{tikzpicture}
\tracingnone
\end{document}