tkz-berge, renumeración de vértices

tkz-berge, renumeración de vértices

EsteCódigo TikZ para dibujar un icosaedro y etiquetarlo.da sólo una respuesta parcial a mi pregunta.

Con el siguiente código

\documentclass{article}

\usepackage{tkz-berge}

\begin{document}

\begin{tikzpicture}

\grPath[Math,prefix=v,RA=-1,RS=0]{9}
\begin{scope}[xshift=0.5 cm]
\grPath[Math,prefix=y,RA=-1,RS=1]{10}
\end{scope}
\begin{scope}[xshift=1.5 cm]
\grPath[Math,prefix=y,RA=-1,RS=2]{10}
\end{scope}

\end{tikzpicture}

\end{document}

tenemos vértices numerados desde $x_0$, $y_o$, $z_0$. ¿Es posible numerarlos desde $x_1$ y así sucesivamente, sin etiquetar manualmente alrededor de 30 posiciones?

Respuesta1

Este es un enfoque más dinámico en el que no es necesario escribir los nombres de cada uno de los vértices.

\documentclass{article}
\usepackage{etoolbox}
\usepackage{tkz-berge}

\def\myInstance#1#2{$#1_{#2}$}
\newcommand\aeAssignLabels[3]{%%
  \let\myexecutable\relax
  \foreach \myn in {#3}
  {%%
    \ifx\myexecutable\relax
      \xdef\myexecutable{\myInstance{#2}{\myn}}%%
    \else
      \xdef\myexecutable{\expandonce\myexecutable,\myInstance{#2}{\myn}}%%
    \fi
  }%%
  \edef\myexecutable{\noexpand#1{#2}{\expandonce\myexecutable}}%%
  \myexecutable
}

\begin{document}

\begin{tikzpicture}
  \SetVertexNoLabel
  \grPath[Math,prefix=x,RA=-1,RS=0]{9}
  \aeAssignLabels\AssignVertexLabel{x}{9,...,1}%%
  \begin{scope}[xshift=0.5 cm]
    \grPath[Math,prefix=y,RA=-1,RS=1]{10}
    \aeAssignLabels\AssignVertexLabel{y}{10,...,1}%%
  \end{scope}
  \begin{scope}[xshift=1.5 cm]
    \grPath[Math,prefix=z,RA=-1,RS=2]{10}
    \aeAssignLabels\AssignVertexLabel{z}{10,...,1}%%
  \end{scope}
\end{tikzpicture}

\end{document}

La idea aquí es usar \foreach, que viene gratis cuando se usa casi cualquier cosa de TikZ. Es posible escribir esto sin usar el etoolboxpaquete, pero es mucho más complicado y difícil de seguir. Sin embargo, al utilizar las etoolboxherramientas del paquete, puede controlar cuándo se produce la expansión de los distintos tokens y crear la macro de asignación y luego ejecutarla.

La macro que defino tiene la siguiente sintaxis:

 \aeAssignLabels<control sequence>{<variable name>}{<range of numbers>}

Usando el \foreachbucle para recorrer elrango, puede crear la macro que se ejecutará. Dado que cada ciclo del bucle de pgf \foreachocurre dentro de un grupo, es necesarioglobalmentehacer las asignaciones. Esto se hace a través de \xdefcuál es equivalente a \global\edefcuál expande el token en su definición en el momento de la definición.

Y, si bien esto puede parecer tanto trabajo como escribir a mano en cada uno de los nombres de los vértices, esperamos que este código ilustre un método que luego puedas duplicar fácilmente en otros lugares y realmente recortar algunos gastos.

Respuesta2

Elrespuesta a la que te vinculastete dice cómo agregar las etiquetas. Primero debe detener la impresión de las etiquetas \SetVertexNoLabely luego debe especificar manualmente las etiquetas que desea usar \AssignVertexLabel:

ingrese la descripción de la imagen aquí

Aquí está el código completo para cambiar manualmente las etiquetas:

\documentclass{article}
\usepackage{tkz-berge}

\begin{document}

\begin{tikzpicture}
  \SetVertexNoLabel
  \grPath[Math,prefix=x,RA=-1,RS=0]{9}
  \AssignVertexLabel{x}{$x_9$,$x_8$,$x_7$,$x_6$,$x_5$,$x_4$,$x_3$,$x_2$,$x_1$};
  \begin{scope}[xshift=0.5 cm]
    \grPath[Math,prefix=y,RA=-1,RS=1]{10}
    \AssignVertexLabel{y}{$y_{10}$,$y_9$,$y_8$,$y_7$,$y_6$,$y_5$,$y_4$,$x_3$,$y_2$,$y_1$};
  \end{scope}
  \begin{scope}[xshift=1.5 cm]
    \grPath[Math,prefix=z,RA=-1,RS=2]{10}
    \AssignVertexLabel{z}{$z_{10}$,$z_9$,$z_8$,$z_7$,$z_6$,$z_5$,$z_4$,$x_3$,$z_2$,$z_1$};
  \end{scope}
\end{tikzpicture}

\end{document}

Editar

Cuando respondí esta pregunta por primera vez, no vi la solicitud para poder hacer esto sina manoinsertando todas las etiquetas. Luego traté de descubrir cómo hacer esto "correctamente". Pude construir la lista de etiquetas con bastante facilidad, pero no pude descubrir cómo pasar esta lista hasta \AssignVertexLabelque se publicó la solución de @A.Ellett. Usando el truco de expansión de la publicación de @A.Ellett aquí hay una versión automatizada que produce el mismo resultado que el anterior.

  \documentclass{article}
  \usepackage{tikz}
  \usepackage{tkz-berge}
  \usepackage{etoolbox}
  \newcommand\AssignMyLabels[2]{% \AssignMyLabels{symbol}{number}
       \def\mylabels{$#1_{1}$}
       \foreach\c in {2,...,#2} {
          \xdef\mylabels{\mylabels, $#1_{\c}$}
       }
       \edef\doThemLabels{\noexpand\AssignVertexLabel{#1}{\expandonce{\mylabels}}}
       \doThemLabels
       }
  \begin{document}

  \begin{tikzpicture}
    \SetVertexNoLabel
    \grPath[Math,prefix=x,RA=-1,RS=0]{9}
    \AssignMyLabels{x}{9}
    \begin{scope}[xshift=0.5 cm]
      \grPath[Math,prefix=y,RA=-1,RS=1]{10}
      \AssignMyLabels{y}{10}
    \end{scope}
    \begin{scope}[xshift=1.5 cm]
      \grPath[Math,prefix=z,RA=-1,RS=2]{10}
      \AssignMyLabels{z}{10}
    \end{scope}
  \end{tikzpicture}

  \end{document}

información relacionada