foreach 루프의 값을 기반으로 다양한 유형의 가장자리를 갖는 방법은 무엇입니까?

foreach 루프의 값을 기반으로 다양한 유형의 가장자리를 갖는 방법은 무엇입니까?

TikZ를 사용하여 Knodel 그래프를 그리려고 합니다. 재현하려는 그래프는 각 "차원"마다 스타일 가장자리가 다릅니다. 나는 갖고 싶다다양한 델타 값에 대한 다양한 가장자리내 foreach 루프에서.

(내가 겪고 있는 별도의 문제는 그래프를 아래와 같이 회전시키는 것입니다.)

다음은종이내가 재현하려고하는 것 : 종이로 만든 Knodel 그래프(그림 1)

지금까지 내가 가진 것은 다음과 같습니다. 여기에 이미지 설명을 입력하세요

내 코드는 다음과 같습니다.

\documentclass[tikz,border=5mm]{standalone}
\usepackage{xparse}

\begin{document}

%from https://tex.stackexchange.com/a/175520
\ExplSyntaxOn
\DeclareExpandableDocumentCommand{\floor}{m}
 {
  \fp_eval:n { floor ( #1 ) }
 }
\ExplSyntaxOff

\tikzstyle{vertex}=[draw, circle, fill=black, inner sep=0.55mm]

\newcommand \knodel[2]{
    \def\N{#1}
    \def\Nhalf{\floor{\N}}
    \def\Delta{#2}

    %make the vertices
    \foreach \j in {0, ..., \numexpr \Nhalf - 1}{
            \node[label=left:{\small (1, \j)}] at (1, \j) [vertex] {};
        }
    \foreach \j in {0, ..., \numexpr \Nhalf - 1}{
            \node[label=right:{\small (2, \j})] at (2, \j) [vertex] {};
        }

    %draw the edges
    \foreach \j in {0, ..., \numexpr \Nhalf - 1}{
        \foreach \k in {0, ..., \numexpr \Delta - 1}{
            %\draw (1,j) to (2, (j + 2^k - 1) mod floor(n/2));
            \pgfmathtruncatemacro \target{mod(\j + (2^\k) - 1,\Nhalf)}
            \draw (1, \j) to (2, \target);
        }
    }
}

\begin{tikzpicture}

\knodel{8}{3}

\end{tikzpicture}
\end{document}

답변1

이것은 단순한 모듈로 산술이 아닌가요?

\documentclass[tikz,border=3.14mm]{standalone}
\usepackage{amsmath}
\newcommand{\kaspressknodel}[2]{\pgfmathtruncatemacro{\mymod}{#1+1}
  \foreach \X in {0,...,#1}
   {\node[bullet,label={right:$\boldsymbol{(2,\X)}$}] (v2\X) at 
   (4,{1.2*(\X-(#1+0)/2)}){};
   \node[bullet,label={left:$\boldsymbol{(1,\X)}$}] (v1\X) at 
   (1.5,{1.2*(\X-(#1+0)/2)}){};}
  \foreach \X [evaluate=\X as \NextX using {int(mod(\X+3,\mymod))},
  evaluate=\X as \AnotherX using {int(mod(\X+1,\mymod))},] in {0,...,#1}
  {\draw[thick] (v1\X) -- (v2\NextX);
  \draw[dashed] (v1\X) -- (v2\AnotherX);
  \draw (v1\X) -- (v2\X);} 
}
\begin{document}
\begin{tikzpicture}[bullet/.style={circle,inner sep=2pt,fill}]
 \begin{scope}[local bounding box=left]
    \kaspressknodel{6}{3} 
 \end{scope}
 %
 \begin{scope}[local bounding box=legend,shift={(left.east)}]
  \foreach \X [count=\Y starting from 0] in {solid,dashed,thick}
  {\draw[\X] (0.5,1-\Y) --++ (1,0) node[right]{dim~\Y};}
 \end{scope}
 \begin{scope}[local bounding box=right,shift={(legend.east)}]
    \kaspressknodel{3}{3} 
 \end{scope}
\end{tikzpicture}
\end{document}

여기에 이미지 설명을 입력하세요

더 많은 Ti케이동일한 결과를 얻는 Zy 방법은 다음과 같습니다.

\documentclass[tikz,border=3.14mm]{standalone}
\usepackage{amsmath}
\tikzset{pics/.cd,
kaspressknodel/.style n args={2}{code={\pgfmathtruncatemacro{\mymod}{#1+1}
  \foreach \X in {0,...,#1}
   {\node[bullet,label={right:$\boldsymbol{(2,\X)}$}] (v2\X) at 
   (4,{1.2*(\X-(#1+0)/2)}){};
   \node[bullet,label={left:$\boldsymbol{(1,\X)}$}] (v1\X) at 
   (1.5,{1.2*(\X-(#1+0)/2)}){};}
  \foreach \X [evaluate=\X as \NextX using {int(mod(\X+3,\mymod))},
  evaluate=\X as \AnotherX using {int(mod(\X+1,\mymod))},] in {0,...,#1}
  {\draw[thick] (v1\X) -- (v2\NextX);
  \draw[dashed] (v1\X) -- (v2\AnotherX);
  \draw (v1\X) -- (v2\X);} 
}}}
\begin{document}
\begin{tikzpicture}[bullet/.style={circle,inner sep=2pt,fill}]
 \pic[local bounding box=left] {kaspressknodel={6}{3}}; 
 %
 \begin{scope}[local bounding box=legend,shift={(left.east)}]
  \foreach \X [count=\Y starting from 0] in {solid,dashed,thick}
  {\draw[\X] (0.5,1-\Y) --++ (1,0) node[right]{dim~\Y};}
 \end{scope}
 %
 \pic[local bounding box=right,shift={(legend.east)}] {kaspressknodel={3}{3}}; 
\end{tikzpicture}
\end{document}

그런 다음 그림을 압축하는 것은 예를 들어 높이를 줄이기 위해 추가된 \pic[local bounding box=left,yscale=0.8] {kaspressknodel={6}{3}};것만 큼 간단합니다. yscale=0.8그런 다음 다이어그램을 회전하거나 색상을 변경할 수도 있습니다.

관련 정보