如何设置 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
),在这种情况下\savebox
es 可能不方便。此提议测量 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}