次のソースは、示されているように動作します。
\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
\pi
pi
\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}