
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 etoolbox
pacote, mas é muito mais complicado e complicado de seguir. No entanto, usando as etoolbox
ferramentas 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 \foreach
loop para percorrer ofaixa, você pode criar a macro a ser executada. Como cada ciclo do loop do pgf \foreach
ocorre dentro de um grupo, você precisaglobalmentefaça as atribuições. Isso é feito por meio de \xdef
qual equivale a \global\edef
qual 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 \SetVertexNoLabel
e, em seguida, especificar manualmente as etiquetas que deseja usar \AssignVertexLabel
:
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é \AssignVertexLabel
que 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}