
Me gustaría implementar un comando \drawColoredGraph
que acepte una lista de n
colores separados por comas y dibuje un gráfico en los vértices 1,...,n
, en el que el vértice k
se colorea con el color proporcionado como k
-ésimo argumento.
Intenté implementar esta funcionalidad usando el \forcsvlist
comando 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 tikzpicture
entorno contiene el gráfico de ejemplo que intento crear automáticamente. El writeColoredNodes
comando muestra que forcsvlist
principalmente hace exactamente lo que quiero que haga.
Por alguna razón, \drawColoredGraph
produce 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, \forcsvlist
usaría \foreach
from 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: