
Lo que está malcon mi uso del parámetro samples en combinación con \pgfmathdeclarefunction
?
Un ejemplo mínimo ofensivo 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 cambiar el valor del parámetro de muestras desplaza la imagen hacia la derecha.
Si edito el ejemplo mínimo samples=10
obtengo
Y ahora,aún más sorprendente: Si elimino la \pgfmathdeclarefunction
declaración de la función y dibujo usando seno directamente, como en
\addplot +[thick] { sin(x) };
el efecto de cambio en las muestras ha desaparecido.
Por supuesto, parece superficial utilizar una declaración de función en este caso simple, pero este es sólo el ejemplo mínimamente 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 colocando un
\hspace*{-10cm}
antes de la imagen tiz, escalando el espacio de acuerdo con la configuración del parámetro de muestras.
Sin embargo, supongo que esto es más bien indicativo de algún error peculiar en el analizador tikz.(o algún peculiar malentendido mío).
¿Alguna idea de cómo resolver esto de una mejor manera?
Observación adicional:Al experimentar más con mi documento original, parece que cada declaración de función que se invoca en el proceso de dibujo agrega algo de espacio horizontal adicional. Dado que en el documento original este anidamiento es muy dinámico, esencialmente hace inviable el uso de Tikz, ya que no conozco de antemano las correcciones horizontales necesarias.
Primera soluciónParece 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.
Respuesta1
\pgfmathdeclarefunction{myfunc}{1}{\pgfmathparse{ sin(#1) } }
contiene espacios en blanco dentro del cuerpo de \pgfmathdeclarefunction
Parece que estos espacios en blanco son de alguna manera responsables del cambio. La conexión con el samples
atributo es coincidente, ya que afecta la cantidad de veces que se llama a la definición. Los espacios en blanco del interior \pgfmathparse
no parecen influir en la posición.
Solución alterna:Quitando los espacios en blanco.
Arreglar:Problema de error enviado a los mantenedores de tikz en github.
Respuesta2
En la versión Git de PGF (futuro 3.1.6) puede configurar /pgf/declare function/ignore spaces=true
cuál ignorará todos los espacios en el cuerpo de una función definida con \pgfmathdeclarefunction
. No recomiendo habilitar esto globalmente o, cuando lo hagas, apágalo nuevamente inmediatamente, porque esto tiene el potencial de dañar 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}