TikZ "let" コマンドの "\coord" マクロの展開

TikZ "let" コマンドの "\coord" マクロの展開

次のコードを検討してください:

\documentclass[border=10pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\def\coord(#1){coordinate(#1)}
\begin{document}
\begin{tikzpicture}
    \node[draw](A) at (0,0) {A};
    \node[draw](B) at (3,3) {B};
    % this works
    \draw let \p1=(A), \p2=(B) in (A) -- (\x1, \y2) coordinate(C);
    % this fails
    % \draw let \p1=(A), \p2=(B) in (A) -- (\x1, \y2) \coord(C);
    \node [right] at (C) {\pgfversion};
\end{tikzpicture}
\end{document}

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

letコメント行が失敗します ---パス内でマクロが展開されていないようです\coord。 これは想定内のことでしょうか?

PD. 私は次のコードを使用するのでこれを使用します:

\def\normcoord(#1){coordinate(#1)}
\def\showcoord(#1){node[circle, red, draw, inner sep=1pt,pin={[red, overlay, inner sep=0.5pt, font=\tiny, pin distance=0.1cm, pin edge={red, overlay,}]45:#1}](#1){}}
\let\coord=\showcoord

図面を作成するときに、「マークされた」ノードと「マークされていない」ノードを切り替えます。

答え1

\coordすでに意味を持つマクロ を呼び出すことを選択したので、運が悪かっただけです。 を使用すると、座標がどのように定義されたかを思い出すことができます。 したがって、\mycoordの代わりに、たとえば を使用すると\coord、コードは期待どおりに動作します。 また、 が何を行うかを示すものも追加しました。これは、構文で特別な意味を持つ 、 、の\coordいとこと考えることができます。 を使用すると、ポイントを「設定」し、その画面座標と、座標が定義された文字列を生成できます。 より詳しくは、使用可能なマクロは次のとおりです ( から取得)。\n\p\x\ylet ... in\p\x\y\coordtikzlibrarycalc.code.tex

  \let\p=\tikz@cc@dop%
  \let\x=\tikz@cc@dox%
  \let\y=\tikz@cc@doy%
  \let\n=\tikz@cc@don%
  \let\rawx=\tikz@cc@dotempx%
  \let\rawy=\tikz@cc@dotempy%
  \let\rawz=\tikz@cc@dotempz%
  \let\coord=\tikz@cc@docoord%

現時点では、座標を定義するために使用された座標の要素である\rawx\rawyおよびも含まれています。\rawz

\documentclass[border=10pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\def\mycoord(#1){coordinate(#1)}
\begin{document}
\begin{tikzpicture}
    \node[draw](A) at (0,0) {A};
    \node[draw](B) at (3,3) {B};
    % this works
    \draw let \p1=(A), \p2=(B) in (A) -- (\x1, \y2) coordinate(C);
    % this also works
    \draw let \p1=(A), \p2=(B) in (A) -- (\x1, \y2) \mycoord(C);
    \node [right] at (C) {\pgfversion};
    \path let \p{A}=(A),\p{B}=(B),\p{C}=(C) in
    (0,3) node[anchor=south west,align=left] {Let us show how\\ 
    we were defined:\\$A=\coord{A}$\\
    $B=\coord{B}$\\ $C=\coord{C}$\\};
\end{tikzpicture}
\end{document}

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

また、または関連ツールは、画面座標が常に投影に過ぎず、特に3番目のコンポーネントが失われるため、3D計算に不可欠なツールであることにも言及しておきます\coord。これがどの程度意味のある方法で使用されるかは、Tiの将来の開発に依存します。Z. 主な問題は、現時点では、どのフレームで座標が定義されたかが記録されないことです。

\coordHenri Menke から依頼があったので、彼が、\rawx\rawyを削除することにしたことを述べておきます\rawz。私見では、この動きは不要であり、動作中のコードを壊します。しかし、この問題は将来発生しないかもしれません。

しかし、これはまったく特別な状況ではありません。むしろ、たとえば、私は通常、ループ変数を などと呼びます。\Xこれ\Yは、calc 構文が と を使用し、 を再定義するからです\x(\y\xデフォルトのプロット パラメータでもあります)。つまり、\x\yも警告なしに上書きされ、ユーザーは通常、マクロに別の名前を付けることで衝突を回避することを学びます。非常に基本的なコマンド (例: \xi) でさえ上書きされることがありますが、これが起こることを知っていれば、常に解決方法を見つけることができます。マクロ名の数は限られています。すべての\foreachループは、警告なしにループ変数を上書きします。

答え2

PGF 3.1.4では、新しいユーザーレベルのコマンドを文書化せずに導入するというミスを犯しました。これらのコマンドは操作内で定義されlet、グローバル定義を無条件に上書きします。これらのローカルマクロは

\rawx
\rawy
\rawz
\coord

これは実験として行われたものですが、今では多くの例で失敗していることが証明されています。そのため、今後の PGF 3.1.5 リリースでは、これらのコマンドを再度削除する予定です。ライブラリletをロードした後、プリアンブルの定義を上書きすることで、操作の正しい動作を復元できますcalc

\documentclass[border=10pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}

\makeatletter
\def\tikz@let@command et{%
  \let\p=\tikz@cc@dop%
  \let\x=\tikz@cc@dox%
  \let\y=\tikz@cc@doy%
  \let\n=\tikz@cc@don%
  \pgfutil@ifnextchar i{\tikz@cc@stop@let}{\tikz@cc@handle@line}%
}%
\makeatother

\def\coord(#1){coordinate(#1)}
\begin{document}
\begin{tikzpicture}
    \node[draw](A) at (0,0) {A};
    \node[draw](B) at (3,3) {B};
    % this works
    \draw let \p1=(A), \p2=(B) in (A) -- (\x1, \y2) coordinate(C);
    % this fails
    \draw let \p1=(A), \p2=(B) in (A) -- (\x1, \y2) \coord(C);
    \node [right] at (C) {\pgfversion};
\end{tikzpicture}
\end{document}

関連情報