Как «добавить» единицы к результатам \pgfmathsetmacro?

Как «добавить» единицы к результатам \pgfmathsetmacro?

Этот вопрос навеянДжейк отвечатькэтот вопрос. Проблема проиллюстрирована следующим 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}

Это дает следующий результат:

введите описание изображения здесь

Но это не то, что я хочу, а именно, чтобы красная полоска была между двумя черными кругами. Я ожидал, что смогу добиться этого, заменив первую \drawкоманду на

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

но затем я получаю бессмысленный результат, в котором красная полоска слишком большая:

введите описание изображения здесь

Это неудивительно, учитывая замечания в разделе 94.1.2 "Соображения относительно единиц" в руководстве pgf (v3.1.2). Что меня удивляет, так это то, что простое добавление cmвот так

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

не работает - в том смысле, что нет никаких изменений в выводе. Однако в ответе Джейка он добавляет ptчто, похоже, работает (о чем свидетельствует его комментарий Somehow, the [...] units got lost, so we add 'pt' at the end. Not nice...).

Итак, мои вопросы:

  1. Почему ptв ответе Джейка сложение работает, а при моем сложении — нет cm?
  2. Я не могу понять раздел 94.1.2. Кажется, есть команды для проверки того, "объявлены" ли единицы, но нет команд для "добавления их обратно" к результату. Какой смысл в возможности проверять единицы, но не "добавлять их обратно"?

решение1

\pgfmathsetmacroвычисляет длину и возвращает результат в pt, но без прикрепленной единицы pt - макрос содержит просто число. Так что если вы хотите использовать это число разумным образом, вам следует повторно прикрепить 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}

Вместо \pdfmathsetmacroвы можете использовать\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}

введите описание изображения здесь

решение2

Очень просто: разделите или умножьте на 1cm. Таким образом, вы можете работать в любых единицах измерения, например, см. ( \rmХотя я не рекомендую использовать их для имени макроса.)

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

введите описание изображения здесь

Связанный контент