Заставляем фотографии действовать как цепь

Заставляем фотографии действовать как цепь

Я беру код, который я составил вМожно ли с помощью TikZ разделить узел по горизонтали и вертикали?, и сделать из этого картинку. Это выполнимо, но размещение последовательныхфотоs проблематичен:фотоs, даже если они именованы, не могут ссылаться друг на друга, хотя на именованные узлы внутри изображения можно ссылаться.

Если высота каждогофотоизмеряется, можно, постфактум, скорректировать положение изображений, используя половину высоты изображения (в необязательном аргументе \step(см. пример кода)).

Я не могу понять, как это сделать с минимальным ручным вмешательством. Ответы наЗакрепление фотографий TiKZпохоже, это предполагает, что при некоторых обстоятельствах это возможно, но я пока не нашел способа их использовать...

\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}

пик цепь бывшая

решение1

Вот ответ, использующий идеи, которые начались вЗакрепление фотографий TiKZ. Как и следовало ожидать, при поиске ответа на этот вопрос я обнаружил ошибку в одной части необходимого кода, которую я исправил в версии tikzmark нагитхаб(дата публикации — декабрь 2023 г., если вы читаете это через несколько месяцев после этой даты, то к настоящему времени информация на CTAN наверняка уже обновлена).

Ключ surround picпомещает прямоугольный узел вокруг изображения с тем же именем, что и у изображения, чтобы его можно было использовать для определения координат, например (<pic name>.south), после определения изображения.

Затем ключ pic anchorустанавливает код, который сдвигает картинку так, чтобы ее «якорь» находился в указанном месте. Использование библиотеки позиционирования означает, что below=0pt of <previous pic>для указания местоположения этой картинки можно использовать такие вещи, как:

Наконец, выясняя, что делает ваш текущий код, я внес несколько косметических изменений, в основном для того, чтобы привести в соответствие с TikZ то, что уже было, например, использовать клавиши для выделения жирным шрифтом и центрирования цифр вместо того, чтобы жестко кодировать это.

\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}

Результат (после нескольких компиляций, чтобы координаты стабилизировались):

Вывод приведенного выше кода, показывающий фотографии, расположенные в вертикальной стопке

Связанный контент