如何在 TikZ 环境中使用 hbox 进行文本尺寸测量?

如何在 TikZ 环境中使用 hbox 进行文本尺寸测量?

我正在尝试使用 来\hbox测量特定文本的尺寸。这在普通文本中有效,如下例所示:

\setbox37=\hbox{this is a text that I want to measure}
text width is \the\wd37, text heigh is \the\ht37\\
text contents: \box37

输出结果和我预期的一样正确:

文本宽度为 159.63913pt,文本高度为 6.94444pt
文本内容:这是我想要测量的文本

但是,当尝试在 TikZ 环境中执行相同操作时,我使用的框未分配我传递给的文本\hbox,而是得到了宽度和高度为零的空框。代码如下:

\begin{tikzpicture}
  \setbox37=\hbox{this is a text that I want to measure}
  \node[draw] at (0,0) {text width is \the\wd37, text heigh is \the\ht37};
  \node[draw] at (0,-1) {text contents is \box37};
\end{tikzpicture}

输出如下:

输出

我在这里遗漏了什么?

答案1

PGF/TikZ 会注意不对其图片环境中的非绘图材料进行排版。整个环境存储在一个框中,该框随后会被丢弃,而(恕我直言)绘图命令会在另一个框中绘图,然后进行排版。这本身不会成为您的代码的问题,但 PGF/TikZ 还会将字体设置为并\nullfont重新定义\selectfont以抑制字体更改。只有对于节点内容和其他“官方”文本(如标签),字体才会恢复。

因此,框中的文本无法排版,并且框为空。跟踪会\tracingall显示以下消息:

{\setbox}
{the letter t}
Missing character: There is no t in font nullfont!
{the letter h}
Missing character: There is no h in font nullfont!
{the letter i}
...

您需要将框设置在图片环境之外,或者恢复字体。您可以使用环境pgfinterruptpicture转为使用字体的正常排版状态。

\documentclass{article}
\usepackage{tikz}

\newbox\mybox

\begin{document}
\begin{tikzpicture}
  \setbox\mybox=\hbox{\pgfinterruptpicture this is a text that I want to measure\endpgfinterruptpicture}
  \node[draw] at (0,0) {text width is \the\wd\mybox, text heigh is \the\ht\mybox};
  \node[draw] at (0,-1) {text contents is \box\mybox};
\end{tikzpicture}
\end{document}

或者,您可以\selectfont手动恢复框内容的字体:

\documentclass{article}
\usepackage{tikz}

\newbox\mybox
\let\origselectfont\selectfont
\newcommand{\restorefont}{%
    \let\selectfont\origselectfont
    \normalfont
}
\begin{document}
\begin{tikzpicture}
  \setbox\mybox=\hbox{\restorefont this is a text that I want to measure}
  \node[draw] at (0,0) {text width is \the\wd\mybox, text heigh is \the\ht\mybox};
  \node[draw] at (0,-1) {text contents is \box\mybox};
\end{tikzpicture}
\end{document}

其他一些注意事项:

  • 您不应该使用纯数字作为方框。方框 #37 可能被其他代码使用。我的第一个猜测是 TikZ 使用它并将其设置为空 :-)
  • 据我所知,\setbox原始颜色可能会出现变化问题。请使用\sbox\mybox{<content>}来处理这些问题。

相关内容