サンプルパラメータに関するTikzの問題、最小限の例

サンプルパラメータに関するTikzの問題、最小限の例

なにが問題ですかサンプルパラメータを と組み合わせて使用​​すると\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}

関連情報