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

これにより、次の出力が生成されます。

ここに画像の説明を入力してください

しかし、これは私が望んでいることではありません。つまり、赤い帯は2つの黒い円の間にあるべきなのです。最初の\drawコマンド を次のように置き換えることで、これを達成できると予想しました。

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

しかし、赤い帯が大きすぎるという意味不明な結果になります。

ここに画像の説明を入力してください

これは、pgfマニュアル(v3.1.2)のセクション94.1.2「単位に関する考慮事項」の記述を考慮すると、驚くべきことではありません。私が驚いたのは、単にcm次のように追加したことです。

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

出力に変化がないという意味では、動作しません。ただし、Jake の回答では、pt(コメント で証明されているようにSomehow, the [...] units got lost, so we add 'pt' at the end. Not nice...) 動作すると思われる が追加されています。

私の質問は次のとおりです:

  1. ptJake の回答では追加が機能するのに、私が追加すると機能しないのはなぜですか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。 こうすることで、cm などの任意の単位で作業できます。 (\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}

ここに画像の説明を入力してください

関連情報