foreach 문을 단축할 수 없습니다.

foreach 문을 단축할 수 없습니다.

다음 코드는 좌표 계단을 생성하는 간단한 이중 foreach 문입니다.

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\begin{document}

\begin{tikzpicture}
\foreach \i in {0,...,10} {
    \pgfmathsetmacro{\r}{10-\i}
    \foreach \j in {0,...,\r} {
        \node at (\i,\j) {$(\i,\j)$};
    }
}
\end{tikzpicture}
\end{document}

10-\i매크로를 설정하지 않고 두 번째 foreach문의 범위 표시자를 직접 넣어서 단순화하고 싶었습니다 . 그러나 내 시도 중 어느 것도 작동하지 않았으며 다양한 오류가 발생했습니다.

시도 1:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\begin{document}

\begin{tikzpicture}
\foreach \i in {0,...,10} {
    \foreach \j in {0,...,10-\i} {
        \node at (\i,\j) {$(\i,\j)$};
    }
}
\end{tikzpicture}
\end{document}

에러 메시지:

! Illegal unit of measure (pt inserted).

시도 2:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\begin{document}

\begin{tikzpicture}
\foreach \i in {0,...,10} {
    \foreach \j in {0,...,(10-\i)} {
        \node at (\i,\j) {$(\i,\j)$};
    }
}
\end{tikzpicture}
\end{document}

에러 메시지:

! Missing number, treated as zero.

시도 3:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\begin{document}

\begin{tikzpicture}
\foreach \i in {0,...,10} {
    \foreach \j in {0,...,{10-\i}} {
        \node at (\i,\j) {$(\i,\j)$};
    }
}
\end{tikzpicture}
\end{document}

에러 메시지:

! Illegal unit of measure (pt inserted).

시도 4:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\begin{document}

\begin{tikzpicture}
\foreach \i in {0,...,10} {
    \foreach \j in {0,...,\pgfmathparse{10-\i}\pgfmathresult} {
        \node at (\i,\j) {$(\i,\j)$};
    }
}
\end{tikzpicture}
\end{document}

에러 메시지:

! Incomplete \iffalse; all text was ignored after line 11.

이 작업을 이런 식으로 수행하는 것은 불가능합니까?

답변1

옵션이 [parse=true]이 작업을 수행합니다.

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

자세한 내용은 다음에서 확인하세요.제88조 반복되는 내용: Foreach 문~의PGF/TikZ 매뉴얼.

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

\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\foreach \i[parse=true] in {0,...,10}
\foreach \j in {0,...,10-\i} 
\path (\i,\j) node{$(\i,\j)$};
\end{tikzpicture}
\end{document}

내 개인적인 의견: TikZ는 foreach매우 유연합니다. 그러나 TikZ/TeX는 계산이 제한된 조판 시스템이므로 Python, Asymptote와 같은 일부 강력한 프로그래밍 언어에 비해 자연스러운 구문과는 거리가 멀습니다. 예를 들어 다음 점근선 코드는 매우 자연스럽습니다. (또한점근선 코드를 .tex 문서에 삽입할 수 있습니다.)

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

// Asymptote has a handy "for" loop
// Run on http://asymptote.ualberta.ca/
size(12cm);
for (int i=0; i<10; ++i)
for (int j=0; j<10-i; ++j)
label("$($"+string(i)+","+string(j)+"$)$",(i,j),blue); 

답변2

동일한 효과를 갖는 evaluate옵션 도 있습니다 .\foreach

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\begin{document}

\begin{tikzpicture}
\foreach \i[evaluate=\i as \r using 10-\i] in {0,...,10} {
    \foreach \j in {0,...,\r} {
        \node at (\i,\j) {$(\i,\j)$};
    }
}
\end{tikzpicture}
\end{document}

답변3

및 Ti를 직접 \the\numexpr10-\i\relax넣을 수 있습니다.\foreach케이Z는 이를 확장합니다(그러나 에서 가능한 계산은 \numexpr매우 제한적이며 기본적으로 +, -, *, / 및 괄호만 가능합니다).

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\begin{document}

\begin{tikzpicture}
\foreach \i in {0,...,10} {
    \foreach \j in {0,...,\the\numexpr10-\i\relax} {
        \node at (\i,\j) {$(\i,\j)$};
    }
}
\end{tikzpicture}
\end{document}

관련 정보