
Was ist falschmit meiner Verwendung des Samples-Parameters in Kombination mit \pgfmathdeclarefunction
?
Ein Beispiel für einen minimalen Verstoß ist das folgende:
\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}
Das Verrückte ist, dass eine Änderung des Wertes des Samples-Parameters das Bild nach rechts verschiebt.
Wenn ich das Minimalbeispiel bearbeite, samples=10
erhalte ich
Und nun,noch erstaunlicher\pgfmathdeclarefunction
: Wenn ich die Deklaration der Funktion entferne und direkt mit Sinus zeichne, wie in
\addplot +[thick] { sin(x) };
der Verschiebungseffekt auf die Samples ist verschwunden.
Natürlich erscheint es oberflächlich, in diesem einfachen Fall eine Funktionsdeklaration zu verwenden - aber das ist nur das minimale Beispiel. Das Originaldokument ist viel umfangreicher, enthält etwa 15 Funktionsdeklarationen und bietet nicht den Luxus einer direkten Darstellung.
Derzeit habe ich einen Workaround, indem ich ein
\hspace*{-10cm}
vor dem Tizpicture, Skalierung des Raums entsprechend der Einstellung des Samples-Parameters.
Ich vermute jedoch, dass dies eher auf einen eigenartigen Fehler im Tikz-Parser hinweist(oder irgendein seltsames Missverständnis meinerseits).
Irgendwelche Ideen, wie man das besser lösen könnte?
Zusätzliche Beobachtung:Beim weiteren Experimentieren mit meinem Originaldokument sieht es so aus, als ob jede Funktionsdeklaration, die während des Zeichnens aufgerufen wird, zusätzlichen horizontalen Raum hinzufügt. Da diese Verschachtelung im Originaldokument hochdynamisch ist, macht sie die Verwendung von Tikz im Wesentlichen unmöglich, da ich die erforderlichen horizontalen Korrekturen nicht im Voraus kenne.
Erste LösungEs sieht so aus, als ob eine teilweise Problemumgehung darin besteht, alle zusätzlichen Leerzeichen im Hauptteil von \pgfmathdeclarefunction zu entfernen. Die Lösung bestätigt auch, dass im Parser ein Fehler vorliegt.
Antwort1
\pgfmathdeclarefunction{myfunc}{1}{\pgfmathparse{ sin(#1) } }
enthält Leerzeichen im Textkörper von \pgfmathdeclarefunction
Es sieht so aus, als ob diese Leerzeichen irgendwie für die Verschiebung verantwortlich sind. Die Verbindung mit dem samples
Attribut ist zufällig, da es die Anzahl der Aufrufe der Definition beeinflusst. Die Leerzeichen innerhalb von \pgfmathparse
scheinen die Position nicht zu beeinflussen.
Problemumgehung:Entfernen der Rohlinge.
Fix:Fehlerproblem an die Tikz-Betreuer bei GitHub gesendet.
Antwort2
In der Git-Version von PGF (zukünftig 3.1.6) können Sie festlegen, /pgf/declare function/ignore spaces=true
dass alle Leerzeichen im Hauptteil einer mit definierten Funktion ignoriert werden \pgfmathdeclarefunction
. Ich empfehle nicht, dies global zu aktivieren oder es, wenn Sie es tun, sofort wieder auszuschalten, da dies möglicherweise andere Dinge beschädigen kann.
\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}