
Ich habe Probleme, den folgenden Code zum Laufen zu bringen:
\documentclass{minimal}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
\foreach \point in {(0,0),(0,2),(2,0),(2,2)} {
\begin{scope}[shift={\point}]
\fill (0,0) circle (0.1) ;
\end{scope}
}
\end{tikzpicture}
\end{document}
Das Protokoll enthält
Paket-Tikz-Fehler: Diese Koordinate kann nicht analysiert werden.
Eine Erklärung finden Sie in der Dokumentation zum Tikz-Paket. Geben Sie H ein, um sofort Hilfe zu erhalten. ...
l.11 } Diese Fehlermeldung wurde von einem \errmessage-Befehl generiert, daher kann ich keine explizite Hilfe geben. Stellen Sie sich vor, Sie wären Hercule Poirot: Untersuchen Sie alle Hinweise und leiten Sie die Wahrheit durch Reihenfolge und Methode ab.Fehlendes Zeichen: In der Schriftart Nullfont ist kein ( vorhanden!
Fehlendes Zeichen: Im Font Nullfont ist keine 0 vorhanden!
Fehlendes Zeichen: In der Schriftart Nullfont ist kein , vorhanden!
Fehlendes Zeichen: Im Font Nullfont ist keine 0 vorhanden!
Fehlendes Zeichen: Im Font Nullfont ist kein ) vorhanden!
Gibt es eine Möglichkeit, diese Koordinaten direkt zu verwenden, oder sollte ich auf den X/Y-Stil zurückgreifen?
Update: (um auf die Behauptung einzugehen, dass () das Problem löst). Ich habe die Miktex-Installation über die Konsole vollständig aktualisiert. Die folgenden Zeilen (direkt verbunden mit der Verwendung von Umschalt + ()) werden jedoch immer noch angezeigt:
Datei: epstopdf-sys.cfg 2021/03/18 v2.0 Konfiguration von epstopdf für MiKTeX ))
Fehlendes Zeichen: Im Font Nullfont ist kein ) vorhanden!
Fehlendes Zeichen: Im Font Nullfont ist kein ) vorhanden!
Fehlendes Zeichen: Im Font Nullfont ist kein ) vorhanden!
Fehlendes Zeichen: Im Font Nullfont ist kein ) vorhanden!
[1]
Genau eine Klammer für jede Koordinate in der Liste (mit unterschiedlicher Punktezahl geprüft).
Antwort1
Wenn der TikZ-Parser (der auch zum Parsen der Koordinaten verwendet wird shift
) auf etwas stößt, das er nicht versteht, versucht er normalerweise, das Davor liegende zu erweitern.
Aus diesem Grund
\fill \point circle (0.1);
funktioniert einwandfrei.
Für den Fall, dass der Benutzer eine falsche Syntax schreibt, verfügt TikZ über eine Ausfallsicherung, indem es einen internen Zähler dekrementiert und die Erweiterungstaktik nur versucht, bis dieser Zähler 0 erreicht. Dieser Zähler startet normalerweise bei 100 und wird je nach Fall um 1 oder 10 dekrementiert.
An bestimmten Stellen wird dieser Zähler auf 100 zurückgesetzt, beispielsweise am Anfang eines Pfades (deshalb
\fill[shift=\point] (0,0) circle (0.1) ;
funktioniert) oder wenn der Parser erfolgreich eine gültige Pfadangabe findet. Eswird nicht zurückgesetztam Anfang des Bildes oder am Anfang eines Bereichs. Und da es zu diesem Zeitpunkt immer noch die Standardeinstellung ist und mit 0 initialisiert wurde, gibt die Analyse einen Fehler aus.
Die Verwendung shift=(\point)
funktioniert, weil es eine weitere Erweiterung von allem gibt, was geschieht, aber es wird zu Warnungen führen von
Missing character: There is no ) in font nullfont!
Dies liegt daran, dass es nun versucht zu analysieren
((0,0))und was passiert ist, dass der Parser erkennt,
(0
dassXWert für die Koordinate und die Sekunde 0
alsjWert. Aber der allerletzte Wert bleibt )
im TeX-Eingabestrom, ähnlich, als ob Sie Folgendes getan hätten:
\path;
Foo
\path;
Warum werden nun keine (0
Fehler ausgegeben? Wie bei vielen Dingen in PGF/TikZ wird dies an PGFmath weitergeleitet und ausgewertet … und PGFmath hat damit kein Problem. Versuchen Sie
\pgfmathparse{(((((1}\pgfmathresult
oder auch
\pgfmathparse{1))))}\pgfmathresult
Anstatt \expanded
und \noexpand
wie in den Kommentaren vorgeschlagen zu verwenden, würde ich empfehlen, die.expanded
SchlüsselhandlerDadurch wird PGFkeys angewiesen, den Wert zu erweitern, bevor er dem Schlüssel zugewiesen wird.
(Oder wir patchen entweder die scope
Umgebung oder den shift
Schlüssel oder setzen den Zähler einfach manuell zurück, aber die Verwendung des Schlüsselhandlers funktioniert an anderen Stellen immer sehr gut, wenn TikZ selbst keine Erweiterung durchführt.)
Code
\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}
\foreach \point in {(0,0),(0,2),(2,0),(2,2)} {
\begin{scope}[shift/.expanded=\point]
\fill (0,0) circle[radius=.1];
\end{scope}
}
\end{tikzpicture}
\end{document}