Über Punkte laufen und diese mit TikZ beschriften

Über Punkte laufen und diese mit TikZ beschriften

Die folgende Quelle funktioniert wie gezeigt.

Gibt es eine Möglichkeit, den auskommentierten \foreachCodeblock so zu ändern, dass er dasselbe tut wie die beiden separaten Zeilen darüber?

Wenn er auskommentiert ist, \foreacherzeugt der Block (wie korrigiert) zwar die zwei Punkte, aber die Beschriftung unter dem ersten Punkt ist falsch: Sie wird wörtlich als (1/pi, 0) angezeigt, während ich das Ergebnis von (1/\pi, 0) anzeigen möchte, nämlich (1/π,0).

(Dies ist ein Spielzeugbeispiel. In der Praxis wird es mehr Punkte geben, daher der Wunsch, eine Schleifenkonstruktion zu verwenden.)

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

Wie man hier Schleifen statt separater Anweisungen für jeden Punkt verwendet

Antwort1

Ich würde vorschlagen, die \foreachSchleife einfach mit einer zweiten Variable anzupassen, in der Sie das zu setzende Zeichen angeben. Wenn die zweite Variable nicht in der Liste angegeben ist, wird stattdessen die vorherige Variable verwendet.

Dies ermöglicht Ihnen

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

und beide \Pointwerden in der zweiten Iteration \Labelenthalten sein .(1, 0)


Sie können jedoch l3regexdas Paket von LaTeX3 verwenden, um Text wie pidurch die Steuersequenz zu ersetzen \pi. Wenn es nur pi/ ist \pi, sollte dies ausreichen, aber bei komplexeren Beispielen wird es nicht so einfach sein. Der zweite Eintrag sollte eigentlich 11° und nicht nur 11 lauten, oder nicht?

Das xstringPaket enthält \StrSubstitutezwar welche, aber die Verwendung mit mehr als einem Ersatz wird mühsamer.

Code

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

Ausgabe

Bildbeschreibung hier eingeben

Bildbeschreibung hier eingeben

verwandte Informationen