PostScript の相対移動 (`rlineto` および `rmoveto`) に相当する PGF

PostScript の相対移動 (`rlineto` および `rmoveto`) に相当する PGF

PostScript (およびを使用) と同様にrmovetorlinetoTikZ を使用すると、現在のポイントの相対的な移動を簡単に生成できます。PGF には同等のものは見当たりません。欠落しているのでしょうか? もしそうなら、その理由を簡単に説明できますか? (PFG での代替案は何ですか?) 相対的な移動がシステム レイヤーには低レベルすぎるとしても (信じがたいことですが)、ベース レイヤーには低レベルすぎるようです。

編集(関連クエリ):非推奨です\pgfrelative(現在のマニュアルには記載されていません)? また、現在のポイントを生成する PGF コマンドは何ですか?

答え1

次の例では、\pgfpathrlineto{<coord>}と の2 つの新しいマクロ\pgfpathrmoveto{<coord>}が提供されています。これらは完全にテストされていないため、注意してください。

実際には、最後のポイントの元の(変換されていない)座標を追跡する必要がありますが、ここで\pgf@x\pgf@y変換された座標を保存します。

ポイントは、 では(x, y) -- ++(2, 3)、変換前の予想される直線は であるのに対し(x, y) -- (x+2, y+3)、次の例で実装したのは であり(x, y) -- ($ (x, y) + T'(2, 3) $)、 はT'変換の反転であるということです。

\documentclass{article}
\usepackage{pgf}

\makeatletter
\def\pgf@path@last@point{%
  \pgfpoint{\pgf@path@lastx}{\pgf@path@lasty}}

% rlineto
\def\pgfpathrlineto#1{%
  \pgf@process{#1}%
  \global\advance\pgf@x\pgf@path@lastx
  \global\advance\pgf@y\pgf@path@lasty
  % similar to \pgfpathlineto, but without applying transformation
  \pgf@nlt@lineto{\pgf@x}{\pgf@y}%
  \global\pgf@path@lastx=\pgf@x
  \global\pgf@path@lasty=\pgf@y
}

% rmoveto
\def\pgfpathrmoveto#1{%
  \pgf@process{#1}%
  \global\advance\pgf@x\pgf@path@lastx
  \global\advance\pgf@y\pgf@path@lasty
  % similar to \pgfpathlineto, but without applying transformation
  \pgf@nlt@moveto{\pgf@x}{\pgf@y}%
  \global\pgf@path@lastx=\pgf@x
  \global\pgf@path@lasty=\pgf@y
}
\makeatother

\begin{document}
\begin{pgfpicture}
  \pgfpathmoveto{\pgfpointorigin}
  \pgfpathlineto{\pgfpoint{20pt}{0pt}}
  \pgfpathmoveto{\pgfpoint{40pt}{0pt}}
  \pgfpathlineto{\pgfpoint{60pt}{0pt}}
  \pgfusepath{draw}
  
  \pgftransformshift{\pgfpoint{10pt}{10pt}}
  \pgfsetcolor{red}
  \pgfpathmoveto{\pgfpointorigin}
  \pgfpathlineto{\pgfpoint{20pt}{0pt}}
  \pgfpathmoveto{\pgfpoint{40pt}{0pt}}
  \pgfpathlineto{\pgfpoint{60pt}{0pt}}
  \pgfusepath{draw}
\end{pgfpicture}
\qquad
% use r(line|move)to
\begin{pgfpicture}
  \pgfpathmoveto{\pgfpointorigin}
  \pgfpathrlineto{\pgfpoint{20pt}{0pt}}
  \pgfpathrmoveto{\pgfpoint{20pt}{0pt}}
  \pgfpathrlineto{\pgfpoint{20pt}{0pt}}
  \pgfusepath{draw}
  
  \pgftransformshift{\pgfpoint{10pt}{10pt}}
  \pgfsetcolor{red}
  \pgfpathmoveto{\pgfpointorigin}
  \pgfpathrlineto{\pgfpoint{20pt}{0pt}}
  \pgfpathrmoveto{\pgfpoint{20pt}{0pt}}
  \pgfpathrlineto{\pgfpoint{20pt}{0pt}}
  \pgfusepath{draw}
\end{pgfpicture}
\end{document}

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

関連情報