Wie „fügt“ man den Ergebnissen von \pgfmathsetmacro Einheiten „hinzu“?

Wie „fügt“ man den Ergebnissen von \pgfmathsetmacro Einheiten „hinzu“?

Diese Frage ist inspiriert vonJakes AntwortZudiese Frage. Das Problem wird durch dieses MWE veranschaulicht:

\documentclass{standalone}
\usepackage{tikz}
\begin{document}

\def\ri{1.0cm} % define inner diameter
\def\ro{2.0cm} % define outer diameter

\begin{tikzpicture}
  \pgfmathsetmacro{\dr}{\ro-\ri} % compute width
  \pgfmathsetmacro{\rm}{(\ri+\ro)/2} % compute mean diameter
  \draw[red,line width=\dr] (0:\ro) arc (0:360:\ro);
  \draw[black] (0,0) circle (\ro) circle (\ri);
\end{tikzpicture}

\end{document}

Dies erzeugt die folgende Ausgabe:

Bildbeschreibung hier eingeben

Aber das ist nicht das, was ich will, nämlich dass der rote Streifen zwischen den beiden schwarzen Kreisen sein soll. Ich hatte erwartet, dass ich das erreichen könnte, indem ich den ersten \drawBefehl durch

\draw[red,line width=\dr] (0:\rm) arc (0:360:\rm);

aber dann bekomme ich ein unsinniges Ergebnis, bei dem der rote Streifen viel zu groß ist:

Bildbeschreibung hier eingeben

Dies ist nicht überraschend, wenn man die Anmerkungen in Abschnitt 94.1.2 „Überlegungen zu Einheiten“ im pgf-Handbuch (v3.1.2) betrachtet. Was mich überrascht, ist, dass ein einfaches Hinzufügen cmwie dieses

\draw[red,line width=\dr] (0:\rm cm) arc (0:360:\rm cm);

funktioniert nicht – in dem Sinne, dass sich die Ausgabe nicht ändert. In Jakes Antwort fügt er jedoch hinzu, ptdass dies zu funktionieren scheint (wie sein Kommentar zeigt Somehow, the [...] units got lost, so we add 'pt' at the end. Not nice...).

Meine Fragen sind also:

  1. Warum funktioniert das Hinzufügen ptin Jakes Antwort, aber nicht, wenn ich hinzufüge cm?
  2. Ich verstehe Abschnitt 94.1.2 nicht. Es scheint Befehle zu geben, mit denen man prüfen kann, ob Einheiten „deklariert“ sind, aber es scheint keine Befehle zu geben, mit denen man sie einem Ergebnis „wieder hinzufügen“ kann. Was nützt es, nach Einheiten suchen zu können, sie aber nicht „wieder hinzufügen“ zu können?

Antwort1

\pgfmathsetmacroberechnet eine Länge und gibt das Ergebnis in pt zurück, allerdings ohne die Einheit pt angehängt zu haben - das Makro enthält einfach eine Zahl. Wenn man diese Zahl also sinnvoll nutzen möchte, sollte man das pt wieder anhängen:

\documentclass{standalone}
\usepackage{tikz}
\begin{document}

\def\ri{1.0cm} % define inner diameter
\def\ro{2.0cm} % define outer diameter

\begin{tikzpicture}
  \pgfmathsetmacro{\dr}{\ro-\ri} % compute width
  \pgfmathsetmacro{\rm}{(\ri+\ro)/2} % compute mean diameter
  \show\rm %<--- shows > \rm=macro: ->42.67912.
  \draw[red,line width=\dr] (0:\rm pt) arc (0:360:\rm pt);
  \draw[black] (0,0) circle (\ro) circle (\ri);
\end{tikzpicture}

\end{document}

Stattdessen \pdfmathsetmacrokönnen Sie verwenden\pgfmathsetlengthmacro

\documentclass{standalone}
\usepackage{tikz}
\begin{document}

\def\ri{1.0cm} % define inner diameter
\def\ro{2.0cm} % define outer diameter

\begin{tikzpicture}
  \pgfmathsetlengthmacro{\dr}{\ro-\ri} % compute width
  \pgfmathsetlengthmacro{\rm}{(\ri+\ro)/2} % compute mean diameter
  \show\rm % > \rm=macro: ->42.67912pt.
  \draw[red,line width=\dr] (0:\rm) arc (0:360:\rm);
  \draw[black] (0,0) circle (\ro) circle (\ri);
\end{tikzpicture}

\end{document}

Bildbeschreibung hier eingeben

Antwort2

Ganz einfach: Dividieren oder multiplizieren mit 1cm. Auf diese Weise können Sie mit beliebigen Einheiten arbeiten, z. B. cm. (Ich empfehle \rmjedoch nicht, für einen Makronamen zu verwenden.)

\documentclass{standalone}
\usepackage{tikz}
\begin{document}

\def\ri{1.0cm} % define inner diameter
\def\ro{2.0cm} % define outer diameter

\begin{tikzpicture}
  \pgfmathsetmacro{\dr}{\ro-\ri} % compute width
  \pgfmathsetmacro{\rm}{(\ri+\ro)/2cm} % compute mean diameter
  \typeout{\rm}
  \draw[red,line width=\dr] (0:\rm*1cm) arc (0:360:\rm*1cm);
  \draw[black] (0,0) circle (\ro) circle (\ri);
\end{tikzpicture}

\end{document}

Bildbeschreibung hier eingeben

verwandte Informationen