Desenhe um gráfico usando Tikz e forcsvlist do etoolbox

Desenhe um gráfico usando Tikz e forcsvlist do etoolbox

Gostaria de implementar um comando \drawColoredGraphque aceite uma lista de ncores 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 \forcsvlistcomando 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 tikzpictureambiente contém o gráfico de exemplo que estou tentando criar automaticamente. O writeColoredNodescomando mostra que o forcsvlistcomando faz exatamente exatamente o que eu quero.

Por algum motivo, \drawColoredGraphproduz 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, \forcsvlisteu usaria \foreachfrom 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:

insira a descrição da imagem aqui

informação relacionada