Проблема Tikz с параметром samples, минимальный пример

Проблема Tikz с параметром samples, минимальный пример

Что не такс использованием мной параметра 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похоже, не влияют на позицию.

Обходной путь:Удаляем пробелы.

Исправить:Информация об ошибке отправлена ​​разработчикам tikz на github.

решение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}

Связанный контент