我正在開發一個廣泛使用命令來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.2 公分。總的來說,這不是一個非常靈活的方法,我相信還有其他人可以做得更好。
\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}