
Я только сейчас изучаю TikZ и экспериментирую с некоторыми управляющими структурами. Может ли кто-нибудь помочь мне с моим кодом ниже?
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{center}
\begin{tikzpicture}
\draw[fill=black] (0,0)circle(0.05) node[above=1.5]{You};
\foreach \(\x,\y) in {(-2,green),(-1,red),(0,black),(1,blue),(2,yellow)}
{
\filldraw[draw=\y] (0,0)--(\x,-1);
\draw[fill=black] (-\x,-1)circle(0.05);
}
\end{tikzpicture}
\end{center}
\end{document}
Я знаю, что проблема возникает там, где я пытаюсь использовать
\foreach \(\x,\y) in {(-2,green),(-1,red),(0,black),(1,blue),(2,yellow)}
Может ли TikZ как-то справиться с чем-то подобным?
решение1
Да, есть способ это сделать.
Из раздела 83/страницы 911Руководство PGF/TikZ (v3.0.0):
Несколько переменных.Часто вам захочется выполнить итерацию по двум переменным одновременно. Поскольку вы можете вкладывать
\foreach
циклы, это обычно просто. Однако иногда вам нужно, чтобы переменные выполняли итерацию «одновременно». Например, нам может быть дан список ребер, соединяющих две координаты, и мы можем захотеть выполнить итерацию по этим ребрам. При этом мы хотели бы, чтобы источник и цель ребер были установлены для двух разных переменных.Для этого можно использовать следующий синтаксис:⟨переменные⟩может быть не только одной переменной TEX. Вместо этого это может быть список переменных, разделенных слешами (
/
). В этом случае элементы списка также могут быть списками значений, разделенных слешами.Предполагая, что⟨переменные⟩и элементы списка представляют собой списки значений, каждый раз⟨команды⟩выполняются, каждая из переменных в⟨переменные⟩устанавливается на одну часть списка, составляющую текущий элемент списка.
Документация PGF/TikZ ~очень подробная, и весь этот раздел \foreach
очень хорошо проводит вас через использование циклов. Я бы не рекомендовал читать от начала до конца, когда вы только начинаете изучать (полный документ >1000 страниц), но это очень хорошо, если вы хотите узнать о чем-то новом в мельчайших подробностях.
Поэтому вам следует заменить строку
\foreach \(\x,\y) in {(-2,green),(-1,red),(0,black),(1,blue),(2,yellow)}
с
\foreach \x/\col in {-2/green, -1/red, 0/black, 1/blue, 2/yellow}
Я бы предложил переименовать вторую переменную в \col
или \color
/ \colour
, потому что это более описательно. Вы можете обнаружить, что довольно часто перебираете пары координат (x,y), так что не хотите запутаться.
Вот как будет выглядеть ваш пример:
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\draw [fill=black] (0,0) circle (0.05) node [above=1.5] {You};
\foreach \x/\col in {-2/green, -1/red, 0/black, 1/blue, 2/yellow}
{
\filldraw [draw=\col] (0, 0) -- (\x, -1);
\draw [fill=black] (-\x, -1) circle (0.05);
}
\end{tikzpicture}
\end{document}
и вот что это компилируется как:
решение2
Ну, даже если бы он поддерживал циклы, подобные Python, \(
это все равно вызвало бы проблемы, так как это встроенная математическая среда, открывающаяся, например \(\alpha\)
, $\alpha$
.
Но это не так.
Поэтому вам нужно использовать
\foreach \x/\y in {-2/green,-1/red,0/black,1/blue,2/yellow}