Этот вопрос навеянДжейк отвечатькэтот вопрос. Проблема проиллюстрирована следующим 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...
).
Итак, мои вопросы:
- Почему
pt
в ответе Джейка сложение работает, а при моем сложении — нетcm
? - Я не могу понять раздел 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}