适合其内容的子图大小(tikzpicture)

适合其内容的子图大小(tikzpicture)

如何设置 a 的宽度subfigure以适合其内容,即 a tikzpicture

在我的 MWE 中,我不想0.1\textwidth分别指定0.9\textwidth,而是希望空白均匀分布在两个子图周围。

\documentclass{article}
\usepackage{showframe}
\usepackage{tikz}
\usepackage{subcaption}

\begin{document}

\begin{figure}[ht]
\hfill
\begin{subfigure}[b]{0.1\textwidth}
\centering
\begin{tikzpicture}
\node[draw] (pd1) {a};
\end{tikzpicture}
\caption{}
\end{subfigure}%
\hfill
\begin{subfigure}[b]{0.9\textwidth}
\centering
\begin{tikzpicture}
\node[draw] (b) at (0,0) {b};
\node[draw] (c) at (5,0) {c};

\draw (b) to (c);
\end{tikzpicture}
\caption{}
\end{subfigure}%
\hfill
\caption{}
\end{figure}

\end{document}

我找到了这个答案我如何才能访问 tikzpicture 外部的边界框的大小?但直到现在才详细阅读。我想知道我的目标是否可以更容易地实现。

答案1

您可以将 放入tikzpicture\savebox并测量其尺寸。然后可以将该尺寸用于subfigure

\documentclass{article}
\usepackage{showframe}
\usepackage{tikz}
\usepackage{subcaption}

\newsavebox{\myboxb}
\newlength{\mylengthb}

\newsavebox{\myboxa}
\newlength{\mylengtha}

\begin{document}

\savebox{\myboxa}{\begin{tikzpicture}
\node[draw] (pd1) {a};
\end{tikzpicture}}
\settowidth{\mylengtha}{\usebox{\myboxa}}

\savebox{\myboxb}{\begin{tikzpicture}
\node[draw] (b) at (0,0) {b};
\node[draw] (c) at (5,0) {c};

\draw (b) to (c);
\end{tikzpicture}}
\settowidth{\mylengthb}{\usebox{\myboxb}}

\begin{figure}[ht]
\mbox{}
\hfill
\begin{subfigure}[b]{\mylengtha}
\usebox{\myboxa}
\caption{}
\end{subfigure}%
\hfill
\begin{subfigure}[b]{\mylengthb}
\usebox{\myboxb}
\caption{}
\end{subfigure}%
\hfill
\mbox{}
\caption{}
\end{figure}

\end{document}

\hfill(感谢@marmot 发现图像和边框之间的问题)

答案2

我认为 @samcarter 的提议很不错。这仅适用于您稍后需要访问节点的情况(使用remember picture),在这种情况下\saveboxes 可能不方便。此提议测量 s 的宽度tikzpicture并将其写入辅助文件,以便在下次运行中使用它们。从概念上讲,它与例如相同这个很好的答案

\documentclass{article}
\usepackage{showframe}
\usepackage{tikz}
\usetikzlibrary{calc}
\usepackage{subcaption}
\ifdefined\figwidthA
\else
\xdef\figwidthA{2cm}
\fi
\ifdefined\figwidthB
\else
\xdef\figwidthB{2cm}
\fi
\tikzset{save tikzpic width in/.style={execute at end picture={
\path let \p1=($(current bounding box.east)-(current bounding box.west)$)
in \pgfextra{\xdef#1{\x1}};}}}
\begin{document}

\begin{figure}[ht]
\hfill
\begin{subfigure}[b]{\figwidthA}
\centering
\begin{tikzpicture}[save tikzpic width in=\figwidthA]
\node[draw] (pd1) {a};
\end{tikzpicture}
\caption{}
\end{subfigure}%
\hfill%
\begin{subfigure}[b]{\figwidthB}
\centering
\begin{tikzpicture}[save tikzpic width in=\figwidthB]
\node[draw] (b) at (0,0) {b};
\node[draw] (c) at (5,0) {c};

\draw (b) to (c);
\end{tikzpicture}
\caption{}
\end{subfigure}%
\hfill{\vphantom{x}}
\caption{}
\end{figure}
\makeatletter 
\immediate\write\@mainaux{\xdef\string\figwidthA{\figwidthA}\relax} 
\immediate\write\@mainaux{\xdef\string\figwidthB{\figwidthB}\relax} 
\makeatother 
\end{document}

在此处输入图片描述

相关内容