¿Cómo "agregar" unidades a los resultados de \pgfmathsetmacro?

¿Cómo "agregar" unidades a los resultados de \pgfmathsetmacro?

Esta pregunta está inspirada enjake respuestaaesta pregunta. El problema se ilustra con este MWE:

\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}

Esto produce el siguiente resultado:

ingrese la descripción de la imagen aquí

Pero esto no es lo que quiero, que es que la franja roja esté entre los dos círculos negros. Esperaba poder lograr esto reemplazando el primer \drawcomando por

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

pero luego obtengo un resultado sin sentido en el que la franja roja es demasiado grande:

ingrese la descripción de la imagen aquí

Esto no es sorprendente dadas las observaciones de la Sección 94.1.2 "Consideraciones relativas a las unidades" del manual pgf (v3.1.2). Lo que si me sorprende es que simplemente añadiendo cmasí

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

no funciona, en el sentido de que no hay cambios en la salida. Sin embargo, en la respuesta de Jake, agrega ptlo que parece funcionar (como lo demuestra su comentario Somehow, the [...] units got lost, so we add 'pt' at the end. Not nice...).

Entonces mis preguntas son:

  1. ¿Por qué sumar ptfunciona en la respuesta de Jake pero no cuando agrego cm?
  2. No puedo entender la Sección 94.1.2. Parece haber comandos para verificar si las unidades están "declaradas", pero no parece haber ningún comando para "agregarlas nuevamente" a un resultado. ¿De qué sirve poder comprobar las unidades pero no "volverlas a agregar"?

Respuesta1

\pgfmathsetmacrocalcula una longitud y devuelve el resultado en pt pero sin la unidad pt adjunta: la macro contiene simplemente un número. Entonces, si desea utilizar este número de manera sensata, debe volver a adjuntar el pt:

\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}

En lugar de \pdfmathsetmacropuedes usar\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}

ingrese la descripción de la imagen aquí

Respuesta2

Muy sencillo: divide o multiplica por 1cm. De esa manera puedes trabajar en las unidades que quieras, como cm. (Sin embargo, no recomiendo usarlo \rmcomo nombre de macro).

\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}

ingrese la descripción de la imagen aquí

información relacionada