"foreach 변수"가 포함된 계산 라이브러리의 이해할 수 없는 동작

"foreach 변수"가 포함된 계산 라이브러리의 이해할 수 없는 동작

다음 코드를 컴파일하면 :

\documentclass[12pt]{article}

\usepackage[french]{babel}
\usepackage{tikz}
\usetikzlibrary{calc}


\begin{document}

\begin{tikzpicture}
\foreach \i in {(0,0),(0,2.1),(2.1,2.1),(2.1,0)} {
\fill[lightgray] \i rectangle ($(\i+(0.7,0.7)$); }
\draw (0,0) grid[step=0.7] (2.8,2.8);
\end{tikzpicture}

\end{document}

나는 아무런 문제가 없으며 이것은 내가 원하는 것을 나에게 제공합니다. 그러나 "$" 사이의 표현식은 괄호가 잘못되었습니다.

$(\i+(0.7,0.7)$다음으로 교체하면 $\i+(0.7,0.7)$다음과 같은 오류 메시지가 나타납니다.

Runaway argument?
\i +(0.7,0.7)$); \pgffor@endhook \ifx \pgffor@assign@after@code \pgfutil@empty 
\ETC.
! Paragraph ended before \tikz@cc@parse@factor was complete.
<to be read again> 
               \par 
l.15 

$(\i+(0.7,0.7)$그리고 다음 으로 대체하거나 $(\i+(0.7,0.7))$다음 $(\i)+(0.7,0.7)$과 같은 오류 메시지가 표시됩니다.

! Package tikz Error: + or - expected.

See the tikz package documentation for explanation.
Type  H <return>  for immediate help.
 ...                                              

l.12 ...htgray] \i rectangle ($(\i)+(0.7,0.7)$); }

버그인가요? 아니면 제가 뭔가 잘못한 것인가요? (아니면 그냥 이상한 구문인가요?)

답변1

OP가 제시한 예에서,

\fill[lightgray] \i rectangle ($(\i+(0.7,0.7)$); 

그럴 수 있다(아마도 그래야 한다).

\fill[lightgray] \i rectangle ++(0.7,0.7); 

그러나 이것이 MWE이고 실제 애플리케이션이 불가피하게 라이브러리의 사용을 요구한다고 가정하면 calc이는 (이미 지적한 바와 같이) 확장 문제입니다. calc라이브러리가 사용되면 다음이 적합할 수 있습니다 .

\documentclass[tikz,border=5]{standalone}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
\foreach \i in {(0,0),(0,2.1),(2.1,2.1),(2.1,0)} {
\fill let \p1=\i in [lightgray] (\p1) rectangle ($(\p1)+(0.7,0.7)$); }
\draw (0,0) grid[step=0.7] (2.8,2.8);
\end{tikzpicture}
\end{document}

하지만

\fill let \p1=\i in [lightgray] (\p1) rectangle (\x1+.7, \y1+.7);

(내 생각에는) 약간 더 효율적일 것입니다.

여기에 이미지 설명을 입력하세요

하지만 가장자리에 살고 싶다면

\makeatletter
\def\pgffor@scanround(#1)#2,{\def\pgffor@value{#1#2}\pgffor@scanned}

당신의 서문에. 그런 다음 ($(\i)+(0.7,0.7)$)foreach 루프 내에서 사용할 수 있습니다.

답변2

내 생각엔 이게 속은 것 같아TikZ에서 수학 사용하기간단히 말해서 컨텍스트를 올바르게 가져오려면 명시적인(따라서 완전히 확장된) 여는 괄호가 필요하고 \i구문을 올바르게 완료하려면 닫는 괄호를 사용하는 이상한 상호 작용입니다. 다른 하나가 나타나면 넘어집니다. 적절한 방법은 모든 것을 자신의 맥락에 맞춰서 꽤 {}장황하게 설명하는 것입니다.

TeX와 TikZ가 구문 분석 토큰에 대해 통신하는 방법에 대한 멋진 데모를 통해 무슨 일이 일어나고 있는지 확인하는 더 좋은 방법은 다음과 같습니다(매우 비직관적이지만). 목록을 포함하여 특정 위치에 누락된 괄호가 있는지 확인하세요.

이러한 일의 주된 이유는 TikZ가 스트림에서 다음 문자가 무엇인지 조사하여 분기하기 때문입니다. 그래서 잘못된 곳으로 분기하고 나중에 올바른 용어를 넣으면 제대로 돌아가서 분기할 수 없습니다. 나는 이런 유형의 프로그래밍에서는 이러한 모든 것을 제거할 수 없다고 생각합니다.

\documentclass[tikz]{standalone}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
\foreach \i in {{(0,0},{(0,2.1},{(2.1,2.1},{(2.1,0}} {
\fill[lightgray] \i) rectangle ($(\i)+(0.7,0.7)$); }
\draw (0,0) grid[step=0.7] (2.8,2.8);
\end{tikzpicture}
\end{document}

여기에 이미지 설명을 입력하세요

답변3

그만한 가치가 있는 경우 추가 중괄호가 없고 올바르게 일치하는 괄호로 설정된 다음 코드가 컴파일되어 예상된 결과를 제공합니다.

\documentclass[12pt]{article}

\usepackage[french]{babel}
\usepackage{tikz}
\usetikzlibrary{calc}

\usepackage{xinttools}

\begin{document}

% \begin{tikzpicture}
% \foreach \i in {(0,0),(0,2.1),(2.1,2.1),(2.1,0)} {
% \fill[lightgray] \i rectangle ($(\i+(0.7,0.7)$); }
% \draw (0,0) grid[step=0.7] (2.8,2.8);
% \end{tikzpicture}

\begin{tikzpicture}
\xintForpair  #1#2 in {(0,0),(0,2.1),(2.1,2.1),(2.1,0)} \do {
\fill[lightgray] (#1,#2) rectangle ($(#1,#2)+(0.7,0.7)$); }
\draw (0,0) grid[step=0.7] (2.8,2.8);
\end{tikzpicture}

\end{document}

답변4

이전의 모든 솔루션은 완벽합니다. 그 중 일부는 코드에서 calc가 왜 엉망인지 설명합니다. 그 중 일부는 foreach"포인트"를 통해 실행 되기 위해 무엇을 변경해야 하는지 설명합니다 (x_i,y_i).

내 생각에는 foreachTikZ의 정신에 있어서 당신의 생각은 "틀리다".

  • 당신이 표현 하고 아니라고 말할 때 \coordinate (A) at (x,y);당신 은 그것을 로 사용합니다 .Ax,y(x,y)(A)
  • 당신이 표현 하고 아니라고 말할 때 let \p1=(x,y)당신 은 그것을 로 사용합니다 .\p1x,y(x,y)(\p1)

foreach그래서 저는 우리가 최저점을 만들고 싶을 때 이렇게 해야 한다고 생각합니다.

\foreach \i in {{x_1,y_1},...,{x_n,y_n}}

그런 다음 (\i).

귀하의 경우에는 다음과 같습니다.

\documentclass[tikz,varwidth,border=5]{standalone}
\usetikzlibrary{calc}
\begin{document}
  \begin{tikzpicture}
    \foreach \i in {{0,0},{0,2.1},{2.1,2.1},{2.1,0}}
      \fill[lightgray] (\i) rectangle ($(\i)+(0.7,0.7)$); 
    \draw (0,0) grid[step=0.7] (2.8,2.8);
  \end{tikzpicture}
\end{document} 

여기에 이미지 설명을 입력하세요

관련 정보