tikzpicture 中定义的子程序中的 \widthof 文本?

tikzpicture 中定义的子程序中的 \widthof 文本?

我已经看到了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在子程序内进行,所以我想问:为什么\widthofa 内是{tikzpicture}零;是否有某种技巧(也许是“全局化”一些 tikz 内部变量?)可以让\widthofa 内的工作{tikzpicture}正常进行?

答案1

正如 @egreg 提到的,在 TikZ 环境中,为了防止非代码垃圾被打印,\nullfont应用了此方法。因此

\tikz{la la laaa. x sdf tgrert}

不打印任何内容。在这里您也可以使用 PGF 数学函数,widthcalc会产生一个愚蠢的副作用,您需要保护文本字体切换三次以免扩展。

% \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}

在此处输入图片描述

相关内容