Пройдитесь по точкам и отметьте их с помощью TikZ

Пройдитесь по точкам и отметьте их с помощью TikZ

Следующий источник работает, как показано.

Есть ли способ изменить закомментированный \foreachблок кода так, чтобы он делал то же самое, что и две отдельные строки над ним?

Если его закомментировать, \foreachблок (исправленный) действительно выдает две точки, но метка под первой точкой неверна: она отображается буквально как (1/пи, 0), тогда как я хочу, чтобы она отображала результат $(1/\пи, 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цикл со второй переменной, где вы указали бы текст, который нужно набрать. Если вторая переменная не указана в списке, вместо нее будет использоваться предыдущая переменная.

Это позволяет вам делать

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

Выход

введите описание изображения здесь

введите описание изображения здесь

Связанный контент