Faça um loop sobre os pontos e rotule-os com TikZ

Faça um loop sobre os pontos e rotule-os com TikZ

A fonte a seguir funciona, conforme mostrado.

Existe uma maneira de alterar o \foreachbloco de código comentado para que ele faça a mesma coisa que as duas linhas separadas acima dele?

Se comentado, o \foreachbloco (conforme corrigido) produz os dois pontos, mas o rótulo abaixo do primeiro ponto está errado: ele é exibido literalmente como (1/pi, 0) enquanto eu quero que ele mostre o resultado de $(1/ \pi, 0)$, ou seja, (1/π,0).

(Este é um exemplo de brinquedo. Na prática, haverá mais pontos, daí o desejo de usar uma construção de loop.)

\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}

Como usar looping em vez de instruções separadas para cada ponto aqui

Responder1

Eu sugeriria apenas ajustar o \foreachloop com uma segunda variável onde você especificou o tet para ser digitado. Se a segunda variável não for especificada na lista, a variável anterior será usada.

Isso permite que você faça

\foreach \Point/\Label in {{(1/pi, 0)}/{(1/\pi, 0)}, (1, 0)}
  \fill \Point circle[radius=2pt] node[below] {$\Label$};

e ambos \Pointe \Labelestarão (1, 0)na segunda iteração.


No entanto, você pode usar o pacote do LaTeX3 l3regexpara substituir texto como pina sequência de controle \pi. Se for apenas pi/ \piisso deveria servir, mas com exemplos mais complexos não será tão fácil. A segunda entrada deveria realmente ser 11° e não apenas 11, não deveria?

O xstringpacote possui \StrSubstitute, mas usá-lo com mais de uma substituição será mais tedioso.

Código

\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}

Saída

insira a descrição da imagem aqui

insira a descrição da imagem aqui

informação relacionada