ポイントをループしてTikZでラベルを付ける

ポイントをループしてTikZでラベルを付ける

次のソースは、示されているように動作します。

\foreachコメントアウトされたコード ブロックを変更して、その上にある 2 つの別々の行と同じことを実行する方法はありますか?

コメントアウトすると、\foreachブロックは(修正されたとおりに)2 つのポイントを生成しますが、最初のポイントの下のラベルが間違っています。文字通り (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

タイプセットするテキストを指定する 2 番目の変数を使用してループを調整することをお勧めします\foreach。リストに 2 番目の変数が指定されていない場合は、代わりに前の変数が使用されます。

これにより、

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

そして、\Pointと は両方とも2 番目の反復に\Label含まれます。(1, 0)


ただし、LaTeX3 のパッケージを使用して、制御シーケンス のl3regexようなテキストを置き換えることができます。 /だけの場合はこれで十分ですが、複雑な例ではそれほど簡単ではありません。 2 番目のエントリは実際には 11° であり、単なる 11 ではないですよね?pi\pipi\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}

出力

ここに画像の説明を入力してください

ここに画像の説明を入力してください

関連情報