Bilder dazu bringen, wie eine Kette zu wirken

Bilder dazu bringen, wie eine Kette zu wirken

Ich nehme den Code, den ich inIst es mit TikZ möglich, einen Knoten horizontal und vertikal zu teilen?, und daraus ein Bild machen. Das ist machbar, aber das Platzieren von aufeinanderfolgendenBilds ist problematisch:Bilds können, auch wenn sie benannt sind, nicht aufeinander verweisen, obwohl auf benannte Knoten innerhalb eines Bilds verwiesen werden kann.

Wenn die Höhe jedesBildgemessen wird, ist es möglich, im Nachhinein die Position der Bilder mithilfe der halben Bildhöhe (im optionalen Argument an \step(siehe Beispielcode)) anzupassen.

Ich habe Probleme damit, mir vorzustellen, wie ich das mit einem Minimum an manuellen Eingriffen erreichen kann. Die Antworten unterTiKZ-Bilder verankernscheinen darauf hinzudeuten, dass dies unter bestimmten Umständen möglich ist, aber ich habe bisher keine Möglichkeit gefunden, sie zu verwenden ...

\documentclass{article}

\usepackage{fontspec,tikz}

\usetikzlibrary{calc,positioning,shapes.multipart,fit,backgrounds}

\newcounter{stepnum}
\newcounter{tmpnum}
\newlength{\recwd}

\setlength{\recwd}{2.5in}

%% |=====8><-----| %%

\makeatletter
  \newcommand{\dist}[3]{% #1 cs for result; #2 tikz coord. 1; #3 tikz coord. -- uses calc
  \tikz@scan@one@point\pgfutil@firstofone($(#2)-(#3)$)\relax  
  \pgfmathsetlengthmacro{#1}{veclen(\the\pgf@x,\the\pgf@y)}% <<<--->>>
  }%
\makeatother

\tikzset{pics/hvmpnode/.style n args={3}{% The basic mechanism: #1=L; #2=UR; #3=LR
    code={%
        \node[name=L\thestepnum,rounded corners=1.5pt,fill=cyan!20] {% Left
            \hbox to 1.25em{\hss\textbf{#1}\hss}
        };
        \node[rounded corners,
            rectangle split,
            rectangle split parts=2,
            rectangle split part fill={yellow!80!orange!20,none},
            align=center,
            rounded corners=1.5pt,
            name=R,
            right= 0pt of L\thestepnum.east] {%
                \nodepart{one}\parbox{\recwd}{\centering\strut#2\strut}% UR
                \nodepart{two}\parbox{\recwd}{\parskip1ex\strut#3\strut}
            };% LR
        \draw[thick]  (R.text split east) -- (R.text split west);
        \node[inner sep=0pt,
            draw,
            thick,
            rounded corners=1.5pt,
            name=W\thestepnum,
            anchor=south west,
            fit=(L\thestepnum)(R)] {};% W = enclosing box
        \draw[thick] (W\thestepnum.south west -| R.west) --
            (W\thestepnum.north west -| R.west);% L/R rule
        \begin{scope}[on background layer]
            \fill[cyan!20,rounded corners=1.5pt] (W\thestepnum.north west) rectangle (R.south west);
        \end{scope}
        }%
    }
}

\NewDocumentEnvironment{example}{s O{} m o}{%
    \setcounter{stepnum}{0}%
    \parbox{\textwidth}{%
        \begingroup
            \bfseries
            \itshape
            \Large
            #3
            \par
        \endgroup
        \IfNoValueF{#4}{%
            \par\small\itshape\rightskip=0.5\textwidth plus 3em#4\par
        }%
    }%
    \par
    \medskip
    \begin{tikzpicture}[]
}{%
    \end{tikzpicture}
    \bigskip
}

\NewDocumentCommand{\step}{O{24pt} m +m}{% #1=materials; #2=technique
    \stepcounter{stepnum}%
    \setcounter{tmpnum}{\numexpr\thestepnum-1\relax}
    \ifnum\thestepnum=1
        \path (0,0) pic{hvmpnode={\thestepnum}{#2}{#3}};
    \else
        \path ([yshift=-#1]0,0 |- W\thetmpnum.south west)%% manually setting yshift as optional argument to \step is possible but icky; this aligns but is suspicious 
            pic{hvmpnode={\thestepnum}{#2}{#3}};%% faulty
    \fi
    \dist{\mydist}{W\thestepnum.north}{W\thestepnum.south}\typeout{!!mydist=\mydist!!}
}

%% |=====8><-----| %%

\parindent0pt

\begin{document}

\thispagestyle{empty}

\begin{example}{Foobar}[This is a meaningless bunch of bla bla bla to see if this works in any way, shape, or form.]
\step{1 2 3 4 5 6}{bla bla bla lkfjdlkj}
\step[49.66pt]{z b c d e f 7 8 9}{Much more bla bla bla and this is so much more jejune nonsense and a lot more bubbishy stuff that makes no sense. Much more bla bla bla and this is so much more jejune nonsense and a lot more bubbishy stuff that makes no sense.}
\step[49.66pt]{z b c d e f 7 8 9}{Much more bla bla bla, Much more bla bla bla and this is so much more jejune nonsense and a lot more bubbishy stuff that makes no sense. Much more bla bla bla and this is so much more jejune nonsense an}
\step[19.66pt]{z b c d e f 7 8 9}{Much more bla bla bla}
\end{example}

For the height of each \texttt{pic}, \texttt{\string\typeout} says:

\begin{tabular}{l}
!!mydist=39.33188pt!!\\
!!mydist=99.33188pt!!\\
!!mydist=99.33188pt!!\\
!!mydist=39.33188pt!!
\end{tabular}

\end{document}

Bildkette Ex

Antwort1

Hier ist eine Antwort auf die Ideen, die inTiKZ-Bilder verankern. Wie es ziemlich unvermeidlich ist, habe ich beim Herausfinden dieser Antwort einen Fehler in einem Teil des erforderlichen Codes gefunden, den ich in der Version von Tikzmark behoben habegithub(Datum der Veröffentlichung Dezember 2023, wenn Sie dies einige Monate nach diesem Datum lesen, wurde es mit ziemlicher Sicherheit inzwischen auf CTAN aktualisiert).

Der Schlüssel surround picplatziert einen rechteckigen Knoten um ein Bild mit dem gleichen Namen wie das Bild, sodass dieser verwendet werden kann, um Koordinaten wie zu definieren, (<pic name>.south)nachdem das Bild definiert wurde.

Der Schlüssel pic anchorinstalliert dann den Code, der das Bild so verschiebt, dass sein „Anker“ an der angegebenen Stelle ist. Mithilfe der Positionierungsbibliothek below=0pt of <previous pic>können Dinge wie verwendet werden, um die Position dieses Bilds anzugeben.

Als ich schließlich herausgefunden hatte, was Ihr aktueller Code macht, nahm ich ein paar kosmetische Änderungen vor, hauptsächlich um bereits vorhandene Dinge in „TikZ“ zu verwandeln, wie etwa die Verwendung von Tasten zum Fettdruck und Zentrieren der Zahlen, anstatt sie fest zu codieren.

\documentclass{article}
%\url{https://tex.stackexchange.com/q/705474/86}
\usepackage{fontspec,tikz}

\usetikzlibrary{
  calc,
  positioning,
  shapes.multipart,
  fit,
  backgrounds,
  tikzmark
}

\newcounter{stepnum}
\newcounter{tmpnum}
\newlength{\recwd}

\setlength{\recwd}{2.5in}

%% |=====8><-----| %%

\tikzset{
  pics/hvmpnode/.style n args={3}{% The basic mechanism: #1=L; #2=UR; #3=LR
    code={%
      \node[
        name=L\thestepnum,
        rounded corners=1.5pt,
        fill=cyan!20,
        text width=1.25em,
        node font=\bfseries,
        align=center,
        node contents={#1}
      ];
      \node[rounded corners,
        rectangle split,
        rectangle split parts=2,
        rectangle split part fill={yellow!80!orange!20,none},
        align=center,
        rounded corners=1.5pt,
        name=R,
        right= 0pt of L\thestepnum.east] {%
        \nodepart{one}\parbox{\recwd}{\centering\strut#2\strut}% UR
        \nodepart{two}\parbox{\recwd}{\parskip1ex\strut#3\strut}
      };% LR
      \draw[thick]  (R.text split east) -- (R.text split west);
      \node[inner sep=0pt,
        draw,
        thick,
        rounded corners=1.5pt,
        name=W\thestepnum,
        anchor=south west,
        fit=(L\thestepnum)(R)] {};% W = enclosing box
      \draw[thick] (W\thestepnum.south west -| R.west) --
      (W\thestepnum.north west -| R.west);% L/R rule
      \begin{scope}[on background layer]
      \fill[cyan!20,rounded corners=1.5pt] (W\thestepnum.north west) rectangle (R.south west);
      \end{scope}
    }%
  }
}

\NewDocumentEnvironment{example}{s O{} m o}{%
  \setcounter{stepnum}{0}%
  \parbox{\textwidth}{%
    \begingroup
    \bfseries
    \itshape
    \Large
    #3
    \par
    \endgroup
    \IfNoValueF{#4}{%
      \par\small\itshape\rightskip=0.5\textwidth plus 3em#4\par
    }%
  }%
  \par
  \medskip
  \begin{tikzpicture}[]
}{%
  \end{tikzpicture}
  \bigskip
}

\tikzset{
  if number/.code n args={3}{
    \ifnum#1\relax
    \pgfkeysalso{#2}
    \else
    \pgfkeysalso{#3}
    \fi
  }
}

\NewDocumentCommand{\step}{O{24pt} m +m}{% #1=materials; #2=technique
  \stepcounter{stepnum}%
  \setcounter{tmpnum}{\numexpr\thestepnum-1\relax}
  \pic[
    name=hvmp\thestepnum,
    surround pic,
    if number={\thestepnum=1}{}{
      pic anchor, 
      below=0pt of hvmp\thetmpnum,
    }
  ] {hvmpnode={\thestepnum}{#2}{#3}};
}

%% |=====8><-----| %%

\parindent0pt

\begin{document}

\thispagestyle{empty}

\begin{example}{Foobar}[This is a meaningless bunch of bla bla bla to see if this works in any way, shape, or form.]
\step{1 2 3 4 5 6}{bla bla bla lkfjdlkj}
\step[49.66pt]{z b c d e f 7 8 9}{Much more bla bla bla and this is so much more jejune nonsense and a lot more bubbishy stuff that makes no sense. Much more bla bla bla and this is so much more jejune nonsense and a lot more bubbishy stuff that makes no sense.}
\step[49.66pt]{z b c d e f 7 8 9}{Much more bla bla bla, Much more bla bla bla and this is so much more jejune nonsense and a lot more bubbishy stuff that makes no sense. Much more bla bla bla and this is so much more jejune nonsense an}
\step[19.66pt]{z b c d e f 7 8 9}{Much more bla bla bla}
\end{example}

\end{document}

Ergebnis (nach einigen Kompilierungen, damit sich die Koordinaten stabilisieren können):

Ausgabe des obigen Codes, der Bilder in einem vertikalen Stapel anzeigt

verwandte Informationen