我已经看到了tikzpicture 中的 \widthof,但这略有不同。
我有一个相当复杂的 Tikz 图像,我希望最终将其包含在 Latex 文档中;因此,我希望这个 .tikz 文件尽可能独立。其中有很多与构建图相关的命令;不幸的是,如果我保持原样,我会得到图片/绘图与表格组图的位置(和/或大小)错误(......和不连续性)?(即使在独立的 .tex 文件中)。具体来说,如果命令在{document}
和之间执行{tikzpicture}
,则会生成多余的空格;我可以在前言中使用这些命令,但 .tikz 文件将不独立。
所以,我想把这些命令收集到一个\def
子程序中,然后运行它们里面。不幸的是{tikzpicture}
,其中一个命令是\widthof
,我打算用它来测量小字体中文本“256”的宽度,并想用它来设置 pgfplot 的 x 比例。所以我想到了这个 MWE:
% \documentclass{article}
\documentclass{standalone}
\usepackage{calc} %\widthof
\usepackage{pgfplots}
\pgfplotsset{compat=1.5.1}
\usetikzlibrary{pgfplots.groupplots}
\usepackage{pgfplotstable}
\pagecolor{yellow!15}
% \newcommand\prepCmds{
\def\prepCmds{
\newlength{\smlblwtmp}
\setlength{\smlblwtmp}{\widthof{\tiny 256}}
\global\let\smlblwid\smlblwtmp
\typeout{smlblwid FIRST: \the\smlblwid}
}
% \prepCmds{} % smlblwid FIRST: 10.2085pt
\begin{document}
% \prepCmds{} % smlblwid FIRST: 10.2085pt
\begin{tikzpicture}
\prepCmds{} % smlblwid FIRST: 0.0pt
\begin{axis}[
x=2*\smlblwid,
]
\addplot {x*0.5};
\end{axis}
\end{tikzpicture}
\end{document}
从中可以看出,仅有的当我调用\prepCmds
内部时{tikzpicture}
,\widtgof
失败并返回 0(在其他地方,它返回一个正确的数字);当发生这种情况时,pdflatex
显示以下内容:
PGFPlots warning: The ticklabel anchor cannot be determined, the normal vector
-(0.0pt,-1.0pt) and the unit y vector (0.0pt,1.00005pt) are almost parallel (ab
s(cos(angle)) = 1.00005pt)!
pgfplots@borderanchor@for@axis 1,2,3: y, 1v0, rectangle
有人会说,正如预期的那样,x 单位为 0 - 但我花了小时到目前为止调试这个:除其他事项外,我\message
在 pgfplots 源中插入了,以便\pgfplots@borderanchor@for@axis
绘制的参数(当宽度不为零时,在\prepCmds
其他地方运行时,参数为x, v00, rectangle
)。
显然,所有这些归结为\widthof
在 a 内返回 0 {tikzpicture}
;既然我知道了这一点,我想我可以将\widthof
计算移出子程序。但是,出于自我约束的原因,我仍然希望计算\widthof
在子程序内进行,所以我想问:为什么\widthof
a 内是{tikzpicture}
零;是否有某种技巧(也许是“全局化”一些 tikz 内部变量?)可以让\widthof
a 内的工作{tikzpicture}
正常进行?
答案1
正如 @egreg 提到的,在 TikZ 环境中,为了防止非代码垃圾被打印,\nullfont
应用了此方法。因此
\tikz{la la laaa. x sdf tgrert}
不打印任何内容。在这里您也可以使用 PGF 数学函数,width
但calc
会产生一个愚蠢的副作用,您需要保护文本字体切换三次以免扩展。
% \documentclass{article}
\documentclass{standalone}
\usepackage{pgfplotstable}
\pgfplotsset{compat=1.5.1}
\usetikzlibrary{pgfplots.groupplots}
\pagecolor{yellow!15}
\newlength\smlblwid
\def\prepCmds{
\pgfmathparse{width("\noexpand\noexpand\noexpand\noexpand\noexpand\noexpand\noexpand\tiny 256")}
\smlblwid=\pgfmathresult pt
}
\begin{document}
\begin{tikzpicture}
\prepCmds{}
\begin{axis}[
x=2*\smlblwid,
]
\addplot {x*0.5};
\end{axis}
\end{tikzpicture}
\end{document}