我希望能够在tikzpicture
环境中测量一些尺寸。
以下是 MWE,用来说明我的意图:
\documentclass {article}
\RequirePackage [utf8] {inputenc}
\RequirePackage {tikz}
\RequirePackage {expl3}
\begin {document}
%\begin {tikzpicture}
\ExplSyntaxOn
\dim_new:N \height
\settoheight {\height} {\fontsize {18} {21.6} \selectfont something}
\dim_log:N \height
\ExplSyntaxOff
%\end {tikzpicture}
\end {document}
当tikzpicture
被注释掉时,height
可以正确测量。
但是,一旦tikzpicture
启用环境, 的height
值就会为0.0pt
。
从日志和互联网上的类似问题来看,发生这种情况是因为tikzpicture
环境将字体设置为nullfont
,其中没有任何字符。
因此,无法测量字形的尺寸。
我尝试tikzpicture
通过添加以下内容来更改环境中的字体:
\renewcommand {\encodingdefault} {OT1}
\renewcommand {\familydefault} {\rmdefault}
\renewcommand {\rmdefault} {cmr}
\renewcommand {\seriesdefault} {m}
\renewcommand {\shapedefault} {n}
\fontencoding {\encodingdefault}
\fontfamily {\familydefault}
\fontseries {\seriesdefault}
\fontshape {\shapedefault}
\selectfont
不幸的是,这并没有改变结果。
唯一能改变结果的就是添加\font\nullfont=cmr18
。
但这种方法有缺点:
- 它确实看起来是一个糟糕的、不安全的代码。
height
disabledtikzpicture
和 enabledtikzpicture
+ new之间有所不同nullfont
。- 看起来像重新定义
nullfont
并且也忽略了这部分代码:\fontsize {18} {21.6}
。
我怎样才能将字体更改为全局字体,仅在内部执行这些测量时tikzpicture
然后再将其更改回来nullfont
?
答案1
如果其他人觉得当前问题与以下问题太相似,我很乐意将其删除这个问题。有两个问题。首先,tikzpicture 中的文本(不在节点中)将被吞噬。所以你需要中断tikzpicture
。然后,如果你测量组内的东西,你需要以某种方式将东西广播到外面。我会在这里使用,\global
但当然还有其他选择。
\documentclass{article}
\RequirePackage[utf8]{inputenc}
\RequirePackage{tikz}
\RequirePackage{expl3}
\begin{document}
\begin{tikzpicture}
\begin{pgfinterruptpicture}%
\ExplSyntaxOn
\dim_new:N \height
\settoheight{\height}{\fontsize{18}{21.6} \selectfont something}
\global\height=\height
\dim_log:N \height
\ExplSyntaxOff
\end{pgfinterruptpicture}%
%\node{\the\height}; %<- requires that the height is smuggled out of the group
\end{tikzpicture}
The height of the text inside the \texttt{tikzpicture} is \the\height. Note
that we had to globalize it because otherwise the height would be local.
\end{document}