Problema de Tikz con el parámetro samples, ejemplo mínimo
¿Qué hay de malo en el uso que hago del parámetro samples en combinación con \pgfmathdeclarefunction?
Un ejemplo mínimo de infracción es el siguiente:
\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}
Lo loco es que al cambiar el valor del parámetro samples, la imagen se desplaza hacia la derecha.
Si edito el ejemplo mínimo para samples=10obtener
Y ahora, aún más asombroso : si elimino la \pgfmathdeclarefunctiondeclaración de la función y dibujo usando sine directamente, como en
\addplot +[thick] { sin(x) };
el efecto de cambio en las muestras desaparece.
Por supuesto, parece superficial usar una declaración de función en este caso simple, pero este es solo el ejemplo mínimo ofensivo. El documento original es mucho más grande, contiene unas 15 declaraciones de funciones y no ofrece el lujo de una trama directa.
Actualmente tengo una solución al colocar un
\hspace*{-10cm}
antes de la imagen de tiz, escalando el espacio de acuerdo con la configuración del parámetro de muestras.
Sin embargo, supongo que esto es indicativo de algún error peculiar en el analizador tikz (o algún malentendido peculiar mío) .
¿Alguna idea de cómo resolver esto de una mejor manera?
Observación adicional: con más experimentos en mi documento original, parece que cada declaración de función que se invoca en el proceso del dibujo agrega algo de espacio horizontal adicional. Dado que en el documento original este anidamiento es altamente dinámico, esencialmente hace inviable el uso de Tikz, ya que no conozco de antemano las correcciones horizontales requeridas.
Primera solución Parece que una solución parcial es eliminar los espacios en blanco adicionales en el cuerpo de \ pgfmathdeclarefunction. La solución también confirma que hay algún error en el analizador.
Respuestas
\pgfmathdeclarefunction{myfunc}{1}{\pgfmathparse{ sin(#1) } }contiene espacios en blanco dentro del cuerpo de \pgfmathdeclarefunctionParece que estos espacios en blanco son de alguna manera responsables del cambio. La conexión con el samplesatributo es coincidente, ya que afecta el número de veces que se llama a la definición. Los espacios en blanco dentro de \pgfmathparseno parecen influir en la posición.
Solución alternativa: quitar los espacios en blanco.
Solución: problema de error enviado a los mantenedores de tikz en github.
En la versión Git de PGF (futura 3.1.6) puede establecer /pgf/declare function/ignore spaces=trueque ignorará todos los espacios en el cuerpo de una función definida con \pgfmathdeclarefunction. No recomiendo habilitar esto globalmente o cuando lo haga, apagarlo inmediatamente nuevamente, porque esto tiene el potencial de romper otras cosas.
\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}