請考慮這段程式碼:
\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
和的近親\y
,它們在語法中也有特殊意義let ... in
。雖然\p
允許您“設定”點,\x
並\y
產生其螢幕座標和\coord
定義座標的字串。更詳細地說,可用的巨集是(取自tikzlibrarycalc.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}
我還要提一下\coord
, 或相關工具是 3D 計算中不可或缺的工具,因為螢幕座標始終只是投影,即除其他外,您會丟失第三個組件。這將在多大程度上以有意義的方式使用取決於鈦的未來發展kZ。
既然 Henri Menke 要我這麼做,我就提到他決定刪除\coord
、\rawx
和。恕我直言,這一舉動是不必要的,並且破壞了工作代碼。但這個問題將來可能不會出現。\rawy
\rawz
然而,這根本不是特殊情況。相反,例如,我通常調用循環變數等\X
,僅僅是因為 calc 語法使用並重新定義了and (也是預設的繪圖參數)。也就是說,也會在沒有警告的情況下被覆蓋,並且使用者通常學會以不同的方式命名巨集來避免衝突。有時甚至非常基本的命令(例如)也會被覆蓋,但只要知道這種情況發生,就總是能找到方法來解決這個問題。巨集名稱的數量是有限的。每個循環都會在沒有警告的情況下覆蓋其循環變數。\Y
\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}