tikzpicture 中的 \savebox 导致 \savebox 为空

tikzpicture 中的 \savebox 导致 \savebox 为空

\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

背景:TiZ 会吞噬文本,除非它是节点的参数。尽管这一点众所周知,但这也有不太明显的影响。特别是,保存框最终可能会是空的。这已经引起了混乱这里这里。在后一篇文章中,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!

相关内容