
O que está erradocom meu uso do parâmetro samples em combinação com \pgfmathdeclarefunction
?
Um exemplo mínimo ofensivo é o seguinte:
\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}
O mais louco é que alterar o valor do parâmetro samples desloca a imagem para a direita.
Se eu editar o exemplo mínimo, samples=10
obtenho
E agora,ainda mais surpreendente: Se eu remover a \pgfmathdeclarefunction
declaração da função e desenhar usando o seno diretamente, como em
\addplot +[thick] { sin(x) };
o efeito de mudança nas amostras desapareceu.
É claro que parece superficial usar uma declaração de função neste caso simples - mas este é apenas o exemplo mínimo ofensivo. O documento original é muito maior, contendo cerca de 15 declarações de funções, e não oferece o luxo de um enredo direto.
Atualmente tenho uma solução alternativa colocando um
\hspace*{-10cm}
antes da imagem tiz, dimensionando o espaço de acordo com a configuração do parâmetro samples.
No entanto, suponho que isso seja indicativo de algum bug peculiar no analisador tikz(ou algum mal-entendido peculiar meu).
Alguma idéia de como resolver isso de uma maneira melhor?
Observação Adicional:Com mais experiências em meu documento original, parece que cada declaração de função invocada no processo de desenho adiciona algum espaço horizontal adicional. Como no documento original esse aninhamento é altamente dinâmico, essencialmente inviabiliza o uso do Tikz, uma vez que não conheço previamente as correções horizontais necessárias.
Primeira soluçãoParece que uma solução parcial é retirar quaisquer espaços em branco adicionais no corpo da \pgfmathdeclarefunction. A solução também confirma que há algum bug no analisador.
Responder1
\pgfmathdeclarefunction{myfunc}{1}{\pgfmathparse{ sin(#1) } }
contém espaços em branco dentro do corpo de \pgfmathdeclarefunction
Parece que esses espaços em branco são de alguma forma responsáveis pela mudança. A conexão com o samples
atributo é coincidente, pois afeta o número de vezes que a definição é chamada. Os espaços em branco \pgfmathparse
não parecem influenciar a posição.
Gambiarra:Removendo os espaços em branco.
Consertar:Problema de bug enviado aos mantenedores do tikz no github.
Responder2
Na versão Git do PGF (futuro 3.1.6), você pode definir /pgf/declare function/ignore spaces=true
qual irá ignorar todos os espaços no corpo de uma função definida com \pgfmathdeclarefunction
. Não recomendo ativar isso globalmente ou, quando o fizer, desligá-lo imediatamente novamente, porque isso pode danificar outras coisas.
\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}