다음 코드를 고려해보세요:
\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
. While을 \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 계산에 없어서는 안 될 도구입니다. 즉, 무엇보다도 세 번째 구성 요소를 잃게 됩니다. 이것이 어느 정도 의미 있는 방식으로 사용될지는 Ti의 향후 개발에 달려 있습니다.케이Z. 가장 큰 문제는 현재로서는 좌표가 어느 프레임에 정의되었는지 기록되지 않는다는 점입니다.
\coord
Henri Menke가 나에게 요청했기 때문에 , 및 을 \rawx
제거 하기로 결정했다고 언급합니다 . IMHO 이 이동은 불필요하며 작업 코드를 손상시킵니다. 그러나 바로 이 문제가 미래에는 나타나지 않을 수도 있습니다.\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}