我正在尝试使用 来\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>}
来处理这些问题。