Gostaria de implementar um comando \drawColoredGraph
que aceite uma lista de n
cores separadas por vírgulas e desenhe um gráfico nos vértices 1,...,n
, no qual o vértice k
é colorido com a cor fornecida como o k
-ésimo argumento.
Tentei implementar essa funcionalidade usando o \forcsvlist
comando do pacote etoolbox muito útil. Eu descobri o seguinte
%!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}
O tikzpicture
ambiente contém o gráfico de exemplo que estou tentando criar automaticamente. O writeColoredNodes
comando mostra que o forcsvlist
comando faz exatamente exatamente o que eu quero.
Por algum motivo, \drawColoredGraph
produz uma lista interminável de mensagens de erro (ou Undefined control sequence.
, Missing \endcsname inserted.
ambas as quais não entendo). O que estou fazendo de errado?
Eu poderia imaginar que o problema está no fato de o compilador primeiro converter --
em um travessão, após o qual o Tikz não reconhece --
mais como uma aresta no gráfico, mas não sei se esse é o cerne do problema, nem como consertar isto .
Alguma sugestão? Eu também estaria aberto a outras abordagens para o problema acima.
Responder1
Em vez de usar, \forcsvlist
eu usaria \foreach
from tikz/pgf, mas acho que o verdadeiro problema é construir o caminho e depois entregá-lo \graph
, o que envolve problemas de expansão.
Aqui está uma maneira de contornar esses dois problemas:
\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}
Aqui está a saída: