Como “adicionar” unidades aos resultados do \pgfmathsetmacro?

Como “adicionar” unidades aos resultados do \pgfmathsetmacro?

Esta pergunta é inspirada emJake responderparaessa questão. O problema é ilustrado por 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}

Isso produz a seguinte saída:

insira a descrição da imagem aqui

Mas não é isso que eu quero, que a faixa vermelha fique entre os dois círculos pretos. Eu esperava conseguir isso substituindo o primeiro \drawcomando por

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

mas então obtenho um resultado sem sentido em que a faixa vermelha é muito grande:

insira a descrição da imagem aqui

Isto não é surpreendente, dadas as observações na Seção 94.1.2 "Considerações sobre unidades" no manual pgf (v3.1.2). O que me surpreende é que simplesmente adicionando cmassim

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

não funciona - no sentido de que não há alteração na saída. No entanto, na resposta de Jake, ele acrescenta pto que parece funcionar (como testemunhado por seu comentário Somehow, the [...] units got lost, so we add 'pt' at the end. Not nice...).

Então minhas perguntas são:

  1. Por que adicionar ptfunciona na resposta de Jake, mas não quando eu adiciono cm?
  2. Não consigo entender a Seção 94.1.2. Parece haver comandos para verificar se as unidades estão "declaradas", mas não parece haver nenhum comando para "adicioná-las de volta" a um resultado. De que adianta poder verificar unidades, mas não "adicioná-las de volta"?

Responder1

\pgfmathsetmacrocalcula um comprimento e retorna o resultado em pt, mas sem a unidade pt anexada - a macro contém simplesmente um número. Então, se você quiser usar esse número de maneira sensata, você deve reanexar o 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}

Em vez de \pdfmathsetmacrovocê pode 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}

insira a descrição da imagem aqui

Responder2

Muito simples: divida ou multiplique por 1cm. Dessa forma você pode trabalhar em qualquer unidade que desejar, como cm. (No entanto, não recomendo usar \rmum nome 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}

insira a descrição da imagem aqui

informação relacionada