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函數的聲明並直接使用正弦繪圖,如

 \addplot +[thick] { sin(x) };

對樣品的移動效應消失了。

當然,在這個簡單的情況下使用函數聲明似乎很膚淺 - 但這只是最小的違規範例。原始文件要大得多,包含大約​​ 15 個函數聲明,並且沒有提供直接繪圖的豪華功能。

目前我有一個解決方法,就是放置一個

 \hspace*{-10cm}

在tizpicture之前,根據samples參數的設定縮放空間。

但是,我認為這表明 tikz 解析器中存在一些特殊的錯誤(或我的一些特殊的誤解)

有什麼想法如何以更好的方式解決這個問題?

附加觀察:透過對我的原始文件進行進一步實驗,看起來在繪圖過程中調用的每個函數聲明都添加了一些額外的水平空間。由於在原始文件中這種嵌套是高度動態的,因此它本質上使得 Tikz 的使用不可行,因為我事先不知道所需的水平校正。

第一個解決方案看起來一種部分解決方法是刪除 \pgfmathdeclarefunction 正文中的任何其他空白。該解決方案還證實解析器中存在一些錯誤。

答案1

\pgfmathdeclarefunction{myfunc}{1}{\pgfmathparse{ sin(#1) } }正文中包含空白\pgfmathdeclarefunction看起來這些空白在某種程度上導致了這種轉變。與屬性的連結samples是巧合的,因為它會影響定義被呼叫的次數。裡面的空白\pgfmathparse似乎不影響位置。

解決方法:刪除空白。

使固定:Bug 問題已發送給 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}

相關內容