tkz-berge, перенумерация вершин

tkz-berge, перенумерация вершин

ЭтотКод TikZ для рисования икосаэдра и маркировкидает лишь частичный ответ на мой вопрос.

С помощью следующего кода

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

у нас есть вершины, пронумерованные от $x_0$, $y_o$, $z_0$. Возможно ли пронумеровать их от $x_1$ и так далее, без ручной маркировки около 30 позиций?

решение1

Вот более динамичный подход, при котором вам не нужно выписывать названия каждой вершины.

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

Идея здесь в том, чтобы использовать \foreach, который предоставляется бесплатно при использовании практически чего угодно из TikZ. Можно написать это и без использования пакета etoolbox, но это гораздо более зациклено и сложнее для понимания. Тем не менее, используя etoolboxинструменты пакета, вы можете контролировать, когда происходит расширение различных токенов, и создавать макрос назначения, а затем выполнять его.

Макрос, который я определяю, имеет следующий синтаксис:

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

Использование \foreachцикла для циклического прохождениядиапазон, вы можете создать макрос для выполнения. Поскольку каждый цикл \foreachцикла pgf происходит внутри группы, вам нужноглобальносделать назначения. Это делается с помощью \xdefwhich, что эквивалентно \global\edefwhich, расширяет токен в его определении во время определения.

И хотя это может показаться таким же трудоемким занятием, как и написание названий вершин вручную, надеюсь, этот код иллюстрирует метод, который вы затем сможете легко скопировать в другом месте и действительно сэкономить некоторые ресурсы.

решение2

Theответ, на который вы ссылаетесьговорит вам, как добавлять этикетки. Сначала вам нужно остановить печать этикеток с помощью \SetVertexNoLabel, а затем вам нужно вручную указать этикетки, которые вы хотите использовать \AssignVertexLabel:

введите описание изображения здесь

Вот полный код для ручного изменения меток:

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

Редактировать

Когда я впервые ответил на этот вопрос, я не видел просьбы сделать это безвручнуювставив все метки. Затем я попытался разобраться, как сделать это "правильно". Я смог достаточно легко построить список меток, но я не мог разобраться, как передать этот список, пока не \AssignVertexLabelбыло опубликовано решение @A.Ellett. Используя трюк с расширением из поста @A.Ellett, вот автоматизированная версия, которая выдает тот же вывод, что и выше.

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

Связанный контент