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}

여기서 아이디어는 \foreachTikZ의 거의 모든 것을 사용할 때 무료로 제공되는 을 사용하는 것입니다. 패키지를 사용하지 않고 이것을 작성하는 것이 가능 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}

관련 정보