写真をチェーンのように機能させる

写真をチェーンのように機能させる

私は、私がまとめたコードをTikZ では、ノードを水平方向と垂直方向に分割することは可能ですか?、それを写真に撮る。これは可能ですが、連続して写真s は問題があります:写真名前付きであっても、pic 内の名前付きノードは参照できますが、pic 内の名前付きノードは参照できません。

それぞれの高さが写真測定された後、オプションの引数で写真の高さの半分を使用して写真の位置を事後に調整することができます (サンプル\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}

写真チェーンex

答え1

ここで、最初に考えたアイデアを使った答えを紹介します。TiKZの写真を固定する当然のことですが、この答えを導き出す過程で、必要なコードの一部にバグが見つかりました。このバグは、tikzmarkのバージョンで修正しました。ギットハブ(投稿日は 2023 年 12 月です。この投稿をその数か月後に読んでいる場合は、今頃 CTAN で更新されているはずです)。

キーは、surround picpic と同じ名前の pic の周囲に長方形のノードを配置します。これにより、(<pic name>.south)pic が定義された後に、 などの座標を定義するために使用できるようになります。

次に、キーはpic anchor、pic の「アンカー」が指定された位置にくるように pic を移動するコードをインストールします。位置決めライブラリを使用すると、次のようなものをbelow=0pt of <previous pic>使用してこの 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}

結果 (座標を安定させるために数回コンパイルした後):

上記のコードの出力。垂直に積み重ねられた写真を表示します。

関連情報