(Vorweg: Falls jemand einen besseren Titel zur Frage formulieren kann, bitte gerne ändern.)

Ich habe in folgendem Beispiel die Verschiebung eines nodes mit \pgfmathsetmacro in eine Variable gespeichert, so dass ich diese jeweils bequem ändern kann.

Open in Online-Editor
\documentclass[a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}[scale=1]
  \pgfmathsetmacro{\unitshift}{5 mm}
  \draw (0,0) node[below=\unitshift,anchor=base] {$a$} -- (0,1);
\end{tikzpicture}
\end{document}

Dies funktioniert einwandfrei, d.h. das "a" wird korrekt um 5 mm nach unten verschoben.

Nun bin ich gezwungen, die positioning-Bibliothek von tikz zu verwenden:

Open in Online-Editor
\documentclass[a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\usetikzlibrary{positioning}

\begin{document}
\begin{tikzpicture}[scale=1]
  \pgfmathsetmacro{\unitshift}{5 mm}
  \draw (0,0) node[below=\unitshift,anchor=base] {$a$} -- (0,1);
\end{tikzpicture}
\end{document}

Hier funktioniert das ganze nicht mehr, das "a" wird um deutlich mehr als 5 mm nach unten geschoben.

Wenn ich \pgfmathsetmacro{\unitshift}{5} schreibe und im node dann below=\unitshift mm,anchor=base, funktioniert das ganze wieder. Ich möchte aber die Einheit "mm" in der Variablen festlegen, um dies z.B. später bequem auf "cm" zu ändern.

Warum tritt dieses Verhalten mit der positioning-Bibliothek auf und gibt es eine Lösung analog zum ersten Beispiel?

gefragt 25 Sep '16, 12:02

tom75's gravatar image

tom75
2.2k187884
Akzeptiert-Rate: 57%

Du benutzt das falsche Makro. Es sollte \pgfmathsetlength{\unitshift}{5 mm} sein.

(26 Sep '16, 10:36) Henri

@Henri Danke für den Alternativvorschlag. Ist es korrekt, dass ich dann davor noch \newlength{\unitshift} schreiben muss?

(26 Sep '16, 13:16) tom75

@tom75 Entweder das oder du verwendest \pgfmathsetlengthmacro{\unitshift}{5 mm}. Weitere Informationen findest du im pgfmanual Abschnitt 89.1.1.

(26 Sep '16, 13:29) sudo

@sudo Alles klar, danke. Bleibt nur noch die Frage, welche Variante die sauberste ist, die von dir bzw. @Henri vorgeschlagene oder die von @saputello. Oder ist das nur Geschmackssache?

(26 Sep '16, 13:33) tom75
1

@tom75 Ich würde behaupten, dass es darauf ankommt, ob du in \unitshift irgendwie rechnen möchtest. Wenn du also \newcommand*{\unitshift}{5mm+10pt} benutzt, kommt das darauf an, wo du das verwendest, ob es richtig funktioniert. \newcommand hat dafür den Vorteil, dass es prüft, ob das Makro schon existiert. Gerade bei relativ allgemeinen englischen Namen, kann es sonst schon mal passieren, dass man etwas überscheibt, was woanders gebraucht wird.

(26 Sep '16, 13:40) sudo

Wenn man sich \unitshift einmal ausgeben lässt (beispielsweise statt $a$), dann sieht man schnell, dass da gar nicht 5 mm gespeichert wird, sondern nur ein Zahlwert. Tatsächlich ist er der zu 5 mm gehörende Wert in pt. Das ist ohne positioning zufällig die Basiseinheit, die below quasi automatisch ergänzt. Mit positioning ist es das aber nicht mehr. Um das Einheitenproblem zu lösen, kann man die gewünschte Einheit bei Verwendung von \unitshift einfach mit angeben.

Open in Online-Editor
\documentclass[a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\usetikzlibrary{positioning}

\begin{document}
\begin{tikzpicture}[scale=1]
  \pgfmathsetmacro{\unitshift}{5 mm}
  \draw (0,0) node[below=\unitshift pt,anchor=base] {$a$} -- (0,1);
\end{tikzpicture}
\end{document}

Wenn die Einheit pt Bestandteil von \unitshift sein soll, dann geht das einfach mit \pgfmathsetlengthmacro:

Open in Online-Editor
\documentclass[a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\usetikzlibrary{positioning}

\begin{document}
\begin{tikzpicture}[scale=1]
  \pgfmathsetlengthmacro{\unitshift}{5 mm}
  \draw (0,0) node[below=\unitshift,anchor=base] {$a$} -- (0,1);
\end{tikzpicture}
\end{document}

Natürlich könnte man \unitshift auch einfach direkt per \newcommand definieren:

Open in Online-Editor
\documentclass[a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\usetikzlibrary{positioning}

\begin{document}
\begin{tikzpicture}[scale=1]
  \newcommand*{\unitshift}{5 mm}
  \draw (0,0) node[below=\unitshift,anchor=base] {$a$} -- (0,1);
\end{tikzpicture}
\end{document}

In diesem Fall wird 5 mm nicht in pt umgerechnet, sondern \unitlength ist direkt 5 mm.

Natürlich kann man statt eines Makros \unitshift auch eine echte Länge \unitshift verwenden. Diese muss dann allerdings zuvor mit \newlength angelegt werden. Das sollte man in der Dokumentpräambel machen:

Open in Online-Editor
\documentclass[a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\usetikzlibrary{positioning}
\newlength{\unitshift}
\begin{document}
\begin{tikzpicture}[scale=1]
  \pgfmathsetlength{\unitshift}{5 mm}
  \draw (0,0) node[below=\unitshift,anchor=base] {$a$} -- (0,1);
\end{tikzpicture}
\end{document}

Alle Lösungen funktionieren unabhängig von der Verwendung von positioning. In allen Fällen kann man auch die Einheit problemlos bei der Definition von \unitshift ändern, ohne bei der späteren Verwendung etwas ändern zu müssen.

Permanenter link

beantwortet 25 Sep '16, 12:44

saputello's gravatar image

saputello
11.1k154365
Akzeptiert-Rate: 51%

bearbeitet 28 Sep '16, 18:22

Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×728
×8
×5
×1

gestellte Frage: 25 Sep '16, 12:02

Frage wurde gesehen: 5,940 Mal

zuletzt geändert: 28 Sep '16, 18:22