Dibujar gráfico usando Tikz y forcsvlist de etoolbox

Dibujar gráfico usando Tikz y forcsvlist de etoolbox

Me gustaría implementar un comando \drawColoredGraphque acepte una lista de ncolores separados por comas y dibuje un gráfico en los vértices 1,...,n, en el que el vértice kse colorea con el color proporcionado como k-ésimo argumento.

Intenté implementar esta funcionalidad usando el \forcsvlistcomando del muy útil paquete etoolbox. Se me ocurrió lo siguiente

%!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}

El tikzpictureentorno contiene el gráfico de ejemplo que intento crear automáticamente. El writeColoredNodescomando muestra que forcsvlistprincipalmente hace exactamente lo que quiero que haga.

Por alguna razón, \drawColoredGraphproduce una lista interminable de mensajes de error (uno Undefined control sequence.o Missing \endcsname inserted.ambos, los cuales no entiendo). ¿Qué estoy haciendo mal?

Me imagino que el problema radica en el hecho de que el compilador primero se convierte --en un guión, después de lo cual Tikz ya no reconoce --como un borde en el gráfico, pero no sé si este es el núcleo del problema ni cómo solucionarlo. .

¿Alguna sugerencia? También estaría abierto a otros enfoques para el problema anterior.

Respuesta1

En lugar de usar, \forcsvlistusaría \foreachfrom tikz/pgf, pero creo que el verdadero problema es construir la ruta y luego dársela a \graph, lo que implica problemas de expansión.

A continuación se muestra una forma de solucionar ambos 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}

Aquí está el resultado:

ingrese la descripción de la imagen aquí

información relacionada