스태킹/그룹화 명령은 tikz 그림을 정의했습니다.

스태킹/그룹화 명령은 tikz 그림을 정의했습니다.

pgfkeys나는 tikz 그림을 생성하는 데 필요한 명령을 광범위하게 사용하는 패키지를 작업 중입니다 . 다음은 간단한 예입니다.

\documentclass[tikz,border=5pt]{standalone}
\makeatletter
\usetikzlibrary{shapes.geometric, calc}
\newcommand{\example}[2][]{
\tikzset{
 /Example/.cd,
 caption/.store in=\Example@caption,
 caption=X,
 #1,
}
\draw [local bounding box=M] rectangle (1,1);
\node at (0.5,0.5) {\Example@caption};
}
\makeatother
\begin{document}
\begin{tikzpicture}
\example[caption=A];
\end{tikzpicture}
\end{document}

예상대로 다음과 같은 출력이 제공됩니다.

매크로 출력

(이것은 단순화를 위해 수행된 예이며 더 복잡한 작업을 수행하는 더 많은 키를 포함하는 실제 명령의 복잡성을 반영하지 않는다는 점을 명심하십시오.)

내가 만들고 싶은 것은 명령 중 하나를 다른 키 값으로 여러 번 추가할 수 있는 두 개의 새로운 목록 환경입니다. 그런 다음 결과 그림은 tikz 그려진 중괄호로 "그룹화"되거나 명령 내에서 정의된 로컬 경계 상자의 남서쪽 모서리에서 아래로 확장되는 선으로 특정 길이로 "쌓여" 존재하는 경우 다음 그림과 연결됩니다(모두 간격은 동일하며 각 사진의 전체 크기는 동일합니다.)

스택과 그룹

내가 이상적으로 찾고 있는 것은 다음과 유사한 목록 환경 구조입니다.

\begin{examplestack}
    \item \example[caption=A] 
    \item \example[caption=B] 
    \item \example[caption=C] 
\end{examplestack}

\begin{examplegroup}
    \item \example[caption=A] 
    \item \example[caption=B] 
    \item \example[caption=C] 
\end{examplegroup}

스택과 그룹 모두 캔버스 내에서 원점 오프셋이 있어야 하며 tikzpicture그룹은 버팀대 끝, 스택은 마지막 줄 하단("깃대" 하단)에 있어야 합니다. 이는 지도와 같은 다른 레이어에 오버레이되는 경우 올바르게 배치될 수 있도록 하기 위한 것입니다.

답변1

개념의 증거. 적어도 이 간단한 경우에는 작동하는 것 같습니다. 길이는 여기저기서 조정해야 합니다. 예를 들어 각 항목의 수직 이동은 단순히 1.2cm로 하드코딩됩니다. 일반적으로 이것은 매우 유연한 접근 방식이 아니며 더 나은 방법을 사용할 수 있는 다른 사람들이 있을 것이라고 확신합니다.

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

\documentclass[tikz,border=5pt]{standalone}
\makeatletter
\usetikzlibrary{shapes.geometric, calc}
\newcommand{\example}[2][]{
\tikzset{
 /Example/.cd,
 caption/.store in=\Example@caption,
 caption=X,
 #1,
}
\draw [local bounding box=M] rectangle (1,1);
\node at (0.5,0.5) {\Example@caption};
}
\makeatother

\newcounter{exitem}

\newenvironment{examplestack}{
\setcounter{exitem}{0}
\renewcommand\item{
% if you only want to draw a line between items
%\ifnum \value{exitem}>0
%  \draw ([xshift=0.5\pgflinewidth]current bounding box.south west) -- ++(0,-0.2cm);
%\fi
%
% if you also want the line below the last item -- not very elegant
\draw (0,{-(1.2cm+\theexitem*1.2cm)}) -- ++(0,-2mm);
%
\stepcounter{exitem}\scoped[yshift=-\theexitem*1.2cm]}
\tikzpicture
}{
%\draw (current bounding box.north west) -- ([yshift=-3pt]current bounding box.south west);
\node [above right] at (current bounding box.north west) {``Stack''};
\endtikzpicture
}

\newenvironment{examplegroup}{
\setcounter{exitem}{0}
\renewcommand\item{\stepcounter{exitem}\scoped[yshift=-\theexitem*1.2cm]}
\tikzpicture
}{
\draw ([shift={(5pt,3pt)}]current bounding box.north west) -| ([shift={(-3pt,-3pt)}]current bounding box.south west) -- ++(8pt,0)
 (current bounding box.west) -- ++(-5pt,0);

\node [above right] at (current bounding box.north west) {``Group''};
\endtikzpicture
}


\begin{document}
\begin{examplegroup}
\item\example[caption=A];
\item\example[caption=B];
\item\example[caption=C];
\end{examplegroup}

\begin{examplestack}
\item\example[caption=A];
\item\example[caption=B];
\item\example[caption=C];
\end{examplestack}
\end{document}

답변2

문제에 대한 Torbjørn T의 답변보다 더 좋고 유연한 솔루션을 생각해 냈기 때문에 이에 대한 답변을 추가해야 한다고 생각합니다. 그들의 솔루션은 다양한 높이의 사진이 동일한 간격을 갖는 것을 허용하지 않았습니다. 길이 매크로를 사용하여 이전 사진의 길이를 저장하고 이를 사용하여 다음 사진의 길이를 상쇄할 수 있었고 좌표 세트를 사용하여 두 사진을 "스택"으로 결합할 수 있었습니다.

중요 사항:는 \item하나의 인수를 취하도록 재정의되었으므로 환경 내에서는 \item{<picture>}대신을 사용해야 합니다 \item <picture>.

이 솔루션은 xparse더 깔끔한 명령 및 환경 구문에 사용되지만 일반 LaTeX 솔루션도 쉽게 사용할 수 있습니다.

서문(MWE의 나머지 부분 포함):

\newcounter{exitem}
\newlength{\itemlength}

"스택" 구문:

\NewDocumentEnvironment{examplestack}{}{
\setlength{\itemlength}{0}
\begin{scope}
\setcounter{exitem}{0}
\RenewDocumentCommand\item{m}{
\scoped[yshift=-\itemlength, local bounding box=T]
##1;
\ifnum \value{exitem}>0
\pgfmathtruncatemacro\result{\value{exitem}-1}
\draw ($(M.south west) + (0, -0.25)$) -- (F\result);
\fi
\coordinate (F\arabic{exitem}) at (M.north west);
\pgfpointdiff{\pgfpointanchor{T}{north west}}{\pgfpointanchor{T}{south west}}
\addtolength{\itemlength}{\pgf@y-5pt} % 5pt is the spacing between pictures.
\stepcounter{exitem}}
}{\end{scope}}

"그룹" 구문:

\NewDocumentEnvironment{examplegroup}{}{
\setlength{\itemlength}{0}
\begin{scope}[local bounding box=G]
\RenewDocumentCommand\item{m}{
\scoped[yshift=-\itemlength, local bounding box=T]
##1;
\pgfpointdiff{\pgfpointanchor{T}{north west}}{\pgfpointanchor{T}{south west}}
\addtolength{\itemlength}{\pgf@y-5pt}} % 5pt is the spacing between pictures.
}{
\draw ([shift={(5pt,3pt)}]G.north west) -| ([shift={(-3pt,-3pt)}]G.south west) -- ++(8pt,0)
 (G.west) -- ++(-5pt,0);
\end{scope}}

예:

\begin{examplegroup}
\item{\example[caption=A]}
\item{\example[caption=B]}
\item{\example[caption=C]}
\end{examplegroup}

\begin{examplestack}
\item{\example[caption=A]}
\item{\example[caption=B]}
\item{\example[caption=C]}
\end{examplestack}

관련 정보