\savebox
在环境中使用tikzpicture
似乎会抹去 的内容\savebox
。在下面的 MWE 中,以下宏定义、测量和显示 的大小\savebox
:
\newcommand*{\DefineBoxAndItSize}{%
\savebox\tempboxA{Hg}%
%% https://tex.stackexchange.com/a/11945/4301
\setlength\SizeOfBox{\dimexpr\ht\tempboxA+\dp\tempboxA\relax}%
}%
\newcommand*{\ShowBoxAndSize}{%
Box \fbox{\usebox{\tempboxA}} is \printlength{\SizeOfBox}%
}
只要\DefineBoxAndItSize
在 之外调用,同时tikzpicture
使用\ShowBoxAndSize
外部(输出的第一行)和里面环境tikzpicture
(输出的第二行)运行良好。
然而,第三行调用\DefineBoxAndItSize
里面之前,最终使盒子变空tikzpicture
。\ShowBoxAndSize
问题:
我如何在环境\savebox
中定义tikzpicture
?
代码:
\documentclass[10pt]{article}
\usepackage{tikz}
\usepackage{printlen}
\newsavebox{\tempboxA}
\newlength{\SizeOfBox}
\fboxsep=0pt
\newcommand*{\DefineBoxAndItSize}{%
\savebox\tempboxA{Hg}%
%% https://tex.stackexchange.com/a/11945/4301
\setlength\SizeOfBox{\dimexpr\ht\tempboxA+\dp\tempboxA\relax}%
}%
\newcommand*{\ShowBoxAndSize}{%
Box \fbox{\usebox{\tempboxA}} is \printlength{\SizeOfBox}%
}
\begin{document}
\DefineBoxAndItSize%
\noindent
Outside TikZ: \ShowBoxAndSize.
\medskip\noindent
\begin{tikzpicture}[inner sep=0pt, anchor=east]
\node at (0,0) {Use inside TikZ: \ShowBoxAndSize.};
\end{tikzpicture}%
\medskip\noindent
\begin{tikzpicture}[inner sep=0pt, anchor=east]
\DefineBoxAndItSize% <--- What is wrong with this?
\node at (0,-1) {Define inside TikZ: \ShowBoxAndSize.};
\end{tikzpicture}%
\end{document}
答案1
背景:Ti钾Z 会吞噬文本,除非它是节点的参数。尽管这一点众所周知,但这也有不太明显的影响。特别是,保存框最终可能会是空的。这已经引起了混乱这里和这里。在后一篇文章中,OP 通过将他们的宏包装在\begin{pgfinterruptpicture}
和中来解决问题\end{pgfinterruptpicture}
。
下一步的复杂化,可能值得也可能不值得一个新的答案,可能是将 savebox 定义包装在一个宏中,\begin{pgfinterruptpicture}
并且\end{pgfinterruptpicture}
只有在环境中调用宏时才这样做tikzpicture
。为此,这个帖子和这个帖子被雇用。(让我指出的是,这\IfInTikzPic
有点不寻常,因为它的第一个参数是当一个人不是在tikzpicture
环境中。这是否与作者在道路另一侧驾驶有关,我不知道。;-)
\documentclass[10pt]{article}
\usepackage{tikz}
\usepackage{printlen}
\newsavebox{\tempboxA}
\newlength{\SizeOfBox}
\fboxsep=0pt
\makeatletter% from https://tex.stackexchange.com/a/458855/121799
\newcommand{\IfInTikzPic}{% https://tex.stackexchange.com/a/121309/4301
\ifx\pgfpictureid\@undefined
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
}
\makeatother
\newcommand*{\DefineBoxAndItSize}{%
\IfInTikzPic{\savebox\tempboxA{Hg}%
% https://tex.stackexchange.com/a/11945/4301
\setlength\SizeOfBox{\dimexpr\ht\tempboxA+\dp\tempboxA\relax}%
}{\begin{pgfinterruptpicture}%
\savebox\tempboxA{Hg}%
% https://tex.stackexchange.com/a/11945/4301
\setlength\SizeOfBox{\dimexpr\ht\tempboxA+\dp\tempboxA\relax}%
\end{pgfinterruptpicture}}
}%
\newcommand*{\ShowBoxAndSize}{%
Box \fbox{\usebox{\tempboxA}} is \printlength{\SizeOfBox}%
}
\begin{document}
\DefineBoxAndItSize%
\noindent
Outside TikZ: \ShowBoxAndSize.
\medskip\noindent
\begin{tikzpicture}[inner sep=0pt, anchor=east]
\node at (0,0) {Use inside TikZ: \ShowBoxAndSize.};
\end{tikzpicture}%
\medskip\noindent
\begin{tikzpicture}[inner sep=0pt, anchor=east]
\DefineBoxAndItSize% <--- What is wrong with this?
\node at (0,-1) {Define inside TikZ: \ShowBoxAndSize.};
\end{tikzpicture}%
\end{document}
如果人们觉得这个问题是重复的,因此不值得单独回答,我很乐意删除这个答案。(但是,在撰写本文时,我的声誉已达到上限,因此原因肯定不是为了获得声誉点数,而我的任何帖子中都没有这个目的。)
编辑:修复了一个空格,非常感谢 Phelype Oleinik!