
Что не такс использованием мной параметра 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}