Estoy trabajando en un paquete que utiliza ampliamente comandos necesarios pgfkeys
para producir una imagen tikz. A continuación se muestra un ejemplo sencillo:
\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}
Esto da el siguiente resultado, como se esperaba:
(Tenga en cuenta que este es un ejemplo hecho para simplificar y no refleja la complejidad de los comandos reales, que contienen muchas más claves que hacen cosas más complejas).
Lo que quiero crear son dos nuevos entornos de lista a los que puedo agregar uno de los comandos varias veces con diferentes valores clave. Las imágenes resultantes luego se "agrupan" con una llave dibujada con tikz o se "apilan" con una línea que se extiende hacia abajo desde la esquina suroeste de un cuadro delimitador local definido dentro del comando hasta una cierta longitud para que se conecte con la siguiente imagen, si está presente (todas tendrán el mismo espacio y cada imagen tendrá el mismo tamaño total):
Lo que idealmente estoy buscando es una estructura de entorno de lista similar a esta:
\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}
Tanto la pila como el grupo deben tener su origen desplazado dentro del tikzpicture
lienzo, el grupo en la punta de la abrazadera, la pila en la parte inferior de la última línea (la parte inferior del "asta de bandera"). Esto es para que puedan colocarse correctamente si se superponen en otra capa (como un mapa).
Respuesta1
Prueba de concepto. Parece funcionar al menos para este caso simple. Será necesario ajustar las longitudes aquí y allá; por ejemplo, el desplazamiento vertical de cada elemento simplemente está codificado en 1,2 cm. En general, este no es un enfoque muy flexible; estoy seguro de que hay otros que podrían hacerlo mejor.
\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}
Respuesta2
Siento que debería agregar una respuesta a esto, ya que logré encontrar una solución mejor y más flexible que la respuesta al problema de Torbjørn T. Su solución no permitía que imágenes de diferentes alturas tuvieran el mismo espacio entre ellas. Mediante el uso de una macro de longitud pude almacenar la longitud de la imagen anterior y usarla para compensar la siguiente, y usando un conjunto de coordenadas pude unirlas en la "Pila".
Nota IMPORTANTE: \item
ha sido redefinido para tomar un argumento, por lo que dentro de los entornos, debes usar \item{<picture>}
en lugar de \item <picture>
.
Esta solución se utiliza xparse
para una sintaxis de entorno y comandos más limpia, pero se podría utilizar una solución LaTeX simple con la misma facilidad.
Preámbulo (más el resto del MWE):
\newcounter{exitem}
\newlength{\itemlength}
La sintaxis de "Pila":
\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}}
La sintaxis del "Grupo":
\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}}
Ejemplos:
\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}