
이것정이십면체 그리기 및 라벨링을 위한 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
루프의 각 주기는 그룹 내에서 발생하므로 다음을 수행해야 합니다.전 세계적으로과제를 만드세요. 이는 정의 당시 정의에서 토큰을 확장하는 것과 \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}