Problema do Tikz com parâmetro de amostras, exemplo mínimo

Problema do Tikz com parâmetro de amostras, exemplo mínimo

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.

insira a descrição da imagem aqui

Se eu editar o exemplo mínimo, samples=10obtenho

insira a descrição da imagem aqui

E agora,ainda mais surpreendente: Se eu remover a \pgfmathdeclarefunctiondeclaraçã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 \pgfmathdeclarefunctionParece que esses espaços em branco são de alguma forma responsáveis ​​pela mudança. A conexão com o samplesatributo é coincidente, pois afeta o número de vezes que a definição é chamada. Os espaços em branco \pgfmathparsenã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=truequal 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}

informação relacionada