다음 소스는 표시된 대로 작동합니다.
\foreach
주석 처리된 코드 블록을 변경하여 위의 두 줄과 동일한 작업을 수행할 수 있는 방법이 있습니까 ?
주석 처리된 경우 \foreach
블록(수정됨)은 두 점을 생성하지만 첫 번째 점 아래의 레이블은 잘못되었습니다. 문자 그대로 (1/pi, 0)으로 표시되는 반면 $(1/ \pi,0)$, 즉 (1/π,0)입니다.
(이것은 장난감 예입니다. 실제로는 더 많은 포인트가 있으므로 루프 구성을 사용하려는 욕구가 있습니다.)
\documentclass[tikz,border=0pt]{standalone}
\begin{document}
\begin{tikzpicture}[domain=0:1,x=7cm,y=2cm]
% axis:
\draw[->,gray,thick] (-0.2,0) -- (1.15,0) node[right,black] {$x$};
% points:
\fill (1/pi, 0) circle[radius=2pt] node[below] {$(1/\pi, 0)$};
\fill (1, 0) circle[radius=2pt] node[below] {$(1, 0)$};
% The following does NOT work!
% \foreach \Point in {(1/pi,0), (1,0)} {
% \fill \Point circle[radius=2pt] node[below] {$\Point$};
% };
\end{tikzpicture}
\end{document}
답변1
\foreach
조판할 tet를 지정한 두 번째 변수로 루프를 조정하는 것이 좋습니다 . 두 번째 변수가 목록에 지정되지 않은 경우 이전 변수가 대신 사용됩니다.
이를 통해 다음을 수행할 수 있습니다.
\foreach \Point/\Label in {{(1/pi, 0)}/{(1/\pi, 0)}, (1, 0)}
\fill \Point circle[radius=2pt] node[below] {$\Label$};
두 번째 반복에서는 둘 다 \Point
및 \Label
가 될 것입니다 .(1, 0)
그러나 LaTeX3 패키지를 사용하여 제어 순서와 l3regex
같은 텍스트를 바꿀 수 있습니다 . 단지 / 이것이 해야 한다면 더 복잡한 예에서는 그렇게 쉽지 않을 것입니다. 두 번째 항목은 실제로 11°가 아니라 11°로 읽어야 합니다. 그렇죠?pi
\pi
pi
\pi
패키지 xstring
에는 있지만 \StrSubstitute
두 개 이상의 교체와 함께 사용하는 것이 더 지루할 것입니다.
암호
\documentclass[tikz]{standalone}
\ExplSyntaxOn
\DeclareDocumentCommand{\tikzmathreplacer}{m}{
\tl_set:Nx \l_tmpa_tl { #1 }
\regex_replace_case_all:nN {
{ pi }{ \c{pi} }
{ sin }{ \c{sin} }
{ * }{ }
} \l_tmpa_tl
\tl_use:N \l_tmpa_tl
}
\ExplSyntaxOff
\begin{document}
\begin{tikzpicture}[domain=0:1,x=7cm,y=2cm]
\draw[->,gray,thick] (-0.2,0) -- (1.15,0) node[right,black] {$x$};
\foreach \Point/\Label in {{(1/pi, 0)}/{(1/\pi, 0)}, (1, 0)}
\fill \Point circle[radius=2pt] node[below] {$\Label$};
\end{tikzpicture}
\begin{tikzpicture}[domain=0:1,x=7cm,y=2cm]
\draw[->,gray,thick] (-0.2,0) -- (1.15,0) node[right,black] {$x$};
\foreach \Point in {(1/pi, 0), ({pi * sin(11)}, 0), (1, 0)}
\fill \Point circle[radius=2pt] node[below] {$\tikzmathreplacer{\Point}$};
\end{tikzpicture}
\end{document}