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循環的每個週期都發生在一個群組內,因此您需要全球做作業。這是透過\xdefwhich 等效於\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}

相關內容