tkz-berge, renumerando vértices

tkz-berge, renumerando vértices

EsseCódigo TikZ para desenhar um icosaedro e rotulardá apenas uma resposta parcial à minha pergunta.

Com o seguinte 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}

temos vértices numerados de $x_0$, $y_o$, $z_0$. É possível numerá-los de $x_1$ e assim por diante, sem rotular manualmente cerca de 30 posições?

Responder1

Aqui está uma abordagem mais dinâmica na qual você não precisa escrever os nomes de cada um dos 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}

A ideia aqui é usar o \foreach, que é gratuito ao usar praticamente qualquer coisa do TikZ. É possível escrever isso sem usar o etoolboxpacote, mas é muito mais complicado e complicado de seguir. No entanto, usando as etoolboxferramentas do pacote, você pode controlar quando ocorre a expansão dos vários tokens e construir a macro de atribuição e depois executá-la.

A macro que defino tem a seguinte sintaxe:

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

Usando o \foreachloop para percorrer ofaixa, você pode criar a macro a ser executada. Como cada ciclo do loop do pgf \foreachocorre dentro de um grupo, você precisaglobalmentefaça as atribuições. Isso é feito por meio de \xdefqual equivale a \global\edefqual expande o token em sua definição no momento da definição.

E, embora isso possa parecer tão trabalhoso quanto escrever à mão em cada um dos nomes dos vértices, espero que este código ilustre um método que você possa duplicar facilmente em outro lugar e realmente cortar alguns cantos.

Responder2

Oresposta que você vinculouinforma como adicionar os rótulos. Primeiro você precisa interromper a impressão das etiquetas \SetVertexNoLabele, em seguida, especificar manualmente as etiquetas que deseja usar \AssignVertexLabel:

insira a descrição da imagem aqui

Aqui está o código completo para alterar manualmente os rótulos:

\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

Quando respondi a esta pergunta pela primeira vez, não vi a solicitação para poder fazer isso semmanualmenteinserindo todas as etiquetas. Então tentei descobrir como fazer isso "corretamente". Consegui construir a lista de rótulos com bastante facilidade, mas não consegui descobrir como passar essa lista até \AssignVertexLabelque a solução de @A.Ellett fosse publicada. Usando o truque de expansão da postagem de @A.Ellett aqui está uma versão automatizada que produz a mesma saída acima.

  \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}

informação relacionada