循环遍历点并使用 TikZ 标记它们

循环遍历点并使用 TikZ 标记它们

下面的源工作正常,如图所示。

有没有办法改变注释掉的\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}

输出

在此处输入图片描述

在此处输入图片描述

相关内容