
なにが問題ですかサンプルパラメータを と組み合わせて使用すると\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=10
、
そしていま、さらに驚くべきことに\pgfmathdeclarefunction
:関数の宣言を削除し、sineを直接使用して描画すると、
\addplot +[thick] { sin(x) };
サンプルのシフト効果はなくなりました。
もちろん、この単純なケースで関数宣言を使用するのは表面的なように思えますが、これは問題のある最小限の例にすぎません。元のドキュメントははるかに大きく、約 15 個の関数宣言が含まれており、直接プロットする贅沢は提供されていません。
現在、私は回避策として
\hspace*{-10cm}
tizpicture の前に、サンプル パラメータの設定に従ってスペースを拡大縮小します。
しかし、これはむしろtikzパーサーの何らかの特異なバグを示しているのではないかと思います。(あるいは私の奇妙な誤解)。
これをもっと良い方法で解決するアイデアはありますか?
追加の観察:元の文書でさらに実験してみると、描画プロセスで呼び出されるすべての関数宣言によって、追加の水平スペースが追加されるようです。元の文書ではこのネストは非常に動的であるため、必要な水平方向の修正が事前にわからないため、Tikz の使用は基本的に不可能になります。
最初の解決策部分的な回避策の 1 つは、\pgfmathdeclarefunction の本体にある余分な空白を削除することであるようです。この解決策により、パーサーに何らかのバグがあることも確認されました。
答え1
\pgfmathdeclarefunction{myfunc}{1}{\pgfmathparse{ sin(#1) } }
の本体内に空白が含まれています。\pgfmathdeclarefunction
これらの空白が何らかの形でシフトの原因となっているようです。属性との関連はsamples
偶然の一致で、定義が呼び出される回数に影響します。 内の空白は\pgfmathparse
位置に影響を与えないようです。
回避策:空白を削除します。
修理:バグの問題が github の tikz メンテナーに送信されました。
答え2
PGF の Git バージョン (将来 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}