
Я хотел бы реализовать команду \drawColoredGraph
, которая принимает список n
цветов, разделенных запятыми, и рисует график по вершинам 1,...,n
, в котором вершина k
окрашена в цвет, указанный в качестве k
аргумента -th.
Я попытался реализовать эту функциональность с помощью \forcsvlist
команды из очень полезного пакета etoolbox. У меня получилось следующее
%!TEX program = lualatex
\documentclass{article}
\usepackage{tikz,etoolbox}
\usetikzlibrary{graphs,graphdrawing}
\usegdlibrary{circular}
\newcounter{countNodes}
\newcommand\drawColoredGraph[1]{%
\setcounter{countNodes}{0}
\begin{tikzpicture}
\graph[simple necklace layout] {
\forcsvlist{\drawNode}{#1} 1;
};
\end{tikzpicture}
}
\newcommand{\drawNode}[1]{\stepcounter{countNodes}\thecountNodes[fill = #1] -- }%
\newcommand\writeColoredNodes[1]{%
\setcounter{countNodes}{0}
\forcsvlist{\writeNode}{#1}1
}
\newcommand{\writeNode}[1]{\stepcounter{countNodes}{\color{#1}\thecountNodes} -- }
\begin{document}
\begin{tikzpicture}
\graph[simple necklace layout] {
1[fill = red] -- 2[fill = blue] -- 3[fill = yellow] -- 4[fill = blue] -- 1;
};
\end{tikzpicture}
\writeColoredNodes{red,blue,yellow,blue} % writes 1–2–3–4–1 in the correct colors
% \drawColoredGraph{red,blue,yellow,blue} % DOES NOT COMPLILE
\end{document}
Среда tikzpicture
содержит пример графика, который я пытаюсь создать автоматически. writeColoredNodes
Команда показывает, что forcsvlist
команда в принципе делает именно то, что я хочу, чтобы она делала.
По какой-то причине \drawColoredGraph
выдает бесконечный список сообщений об ошибках (либо , Undefined control sequence.
либо Missing \endcsname inserted.
, оба из которых я не понимаю). Что я делаю не так?
Я могу предположить, что проблема заключается в том, что компилятор сначала преобразует его --
в тире, после чего Tikz --
больше не распознает его как ребро в графе, но я не знаю, является ли это сутью проблемы и как ее исправить.
Есть предложения? Я также был бы открыт для других подходов к решению вышеуказанной проблемы.
решение1
Вместо использования \forcsvlist
я бы использовал \foreach
tikz/pgf, но я думаю, что настоящая проблема заключается в построении пути и его последующей передаче в \graph
, что влечет за собой проблемы с расширением.
Вот способ обойти обе эти проблемы:
\documentclass{article}
\usepackage{tikz}
\usepackage{etoolbox}% for \xappto
\usetikzlibrary{graphs,graphdrawing}
\usegdlibrary{circular}
\newcommand\drawColoredGraph[1]{%
% build the graph specifications
\def\graphspecs{}%
\foreach \colour [count=\g] in {#1} {
\xappto\graphspecs{\g [fill=\colour] -- }
}%
% expand specs but not \graph -- and close off graph specs by adding 1
\xdef\graphspecs{\noexpand\graph[simple necklace layout]{\graphspecs 1}}%
\begin{tikzpicture}% draw the graph
\graphspecs;
\end{tikzpicture}%
}
\begin{document}
\drawColoredGraph{red,blue,yellow,blue}
\end{document}
Вот что получилось: