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循环来循环范围,您可以构建要执行的宏。由于 pgf\foreach循环的每个循环都发生在一个组中,因此您需要全球进行分配。这是通过\xdef相当于\global\edef在定义时扩展其定义中的标记来完成的。

尽管这看起来与手写每个顶点名称一样费力,但希望此代码能够说明一种方法,您可以轻松地在其他地方复制并真正省去一些麻烦。

答案2

您链接到的答案确实告诉您如何添加标签。您首先需要使用 停止打印标签\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}

相关内容