下面的源工作正常,如图所示。
有没有办法改变注释掉的\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
软件包将文本替换pi
为控制序列\pi
。如果只是pi
/,\pi
这应该可以,但对于更复杂的例子,就没那么容易了。第二个条目实际上应该是 11°,而不仅仅是 11,不是吗?
该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}