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$ と番号が付けられています。約 30 個の位置に手動でラベルを付けずに、$x_1$ などから番号を付けることは可能ですか?

答え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ループの各サイクルはグループ内で発生するため、世界的に割り当てを行います。これは、定義時にトークンをその定義内で展開する which\xdefと同等の which を介して行われます。\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}

関連情報