图形应用程序创建 tikz 图片文件。没有对周围文档的控制。如何确保图片编译,无论是否加载 fpu 库,是否处于活动状态?下面的代码会抛出错误,
! Illegal unit of measure (pt inserted).
<to be read again>
Y
l.7 \tikzpicture\node(1,0){A};
\endtikzpicture
以下是代码:
\documentclass{minimal}
\usepackage{tikz}
\usepgflibrary{fpu} %
% no control over the document
\begin{document} %
\pgfkeys{/pgf/fpu} %
% what to do here? % generated code
\tikzpicture\node(1,0){A};\endtikzpicture %
\end{document}
答案1
错误解释
当通过 激活时/pgf/fpu
,PGF 浮点单元 (FPU) 会更改 PGF 计算的输出格式,特别是命令的输出格式\pgfmathresult
。FPU 处于活动状态时的默认格式(对应于设置/pgf/fpu/output format
为值float
)输出数字,形式如下1Y2.0e0]
(1
是代表“正数”的标志,2.0
是尾数并e0
指定 的指数0
;因此,以这种格式1Y2.0e0]
表示 2x10 0,即数字 2)。
这种数字格式非常适合计算,因为它可以以合理的精度表示较大的数据范围,但是 Ti钾Z 代码通常不期望采用这种格式的数字(pgfplots
据我所知,也不期望采用)。当 Ti钾Z 尝试读取一个坐标,发现1Y2.0e0]
作为使用 PGF 执行的计算的结果,它会导致 TeX 将其解析为长度(很可能是 〈dimen〉),这失败了,因为它Y
不是 TeX 识别的度量单位——如果是,那无论如何都会导致混乱。这解释了您引用的错误消息:
! Illegal unit of measure (pt inserted).
<to be read again>
Y
l.7 \tikzpicture\node(1,0){A};
\endtikzpicture
(当 TeX 遇到错误时,它会像往常一样尝试提供帮助,并主动在pt
期望测量单位的位置插入一个单位,以便继续编译……但这在当今快速的计算机中通常没有多大帮助。)
如何解决
您可以暂时关闭图片排版组内的 PGF 浮点单元。
第一种方法
在这个方法中,我们仅当此键存在时才在组内设置 (否则,/pgf/fpu
如果我们在未加载库时尝试设置此键,则会引发错误)。非常感谢 Ulrike Fischer 提供的有关 的提示!false
pgfkeys
fpu
.try=
\documentclass{article}
\usepackage{tikz}
\usepgflibrary{fpu} %
% no control over the document
%
\begin{document} % no control over the document
\pgfkeys{/pgf/fpu} %
{\pgfkeys{/pgf/fpu/.try=false}% switch the FPU off inside this group
\tikzpicture\node(1,0){A};\endtikzpicture
}
\bigskip
% Show that the FPU state is restored to “on” after the group has ended
\pgfmathparse{1+1}\pgfmathresult
\end{document}
第二种方法
在第二种方法中,仅当我们检测到PGF 库已加载时,我们才/pgf/fpu
将其设置false
为组内。fpu
\documentclass{article}
\usepackage{tikz}
\usepgflibrary{fpu} %
% no control over the document
%
\begin{document} % no control over the document
\pgfkeys{/pgf/fpu} %
{\makeatletter
\ifcsname pgf@library@fpu@loaded\endcsname
\pgfkeys{/pgf/fpu=false}% switch the FPU off inside this group
\fi
\makeatother
%
\tikzpicture\node(1,0){A};\endtikzpicture
}
\bigskip
% Show that the FPU state is restored to “on” after the group has ended
\pgfmathparse{1+1}\pgfmathresult
\end{document}
前面的内容是在假设您之前无法添加代码并且可能必须以编程方式包含多个这样的片段的情况下编写的。\begin{document}
如果不是这种情况,另一个选择是定义一个\IfPGFLibraryLoaded
命令(类似于\IfTikzLibraryLoaded
这个答案) 并仅当此命令检测到已加载 PGF 库时才将其设置/pgf/fpu
为false
组内fpu
。这可以通过在之前使用以下命令来完成\begin{document}
:
\makeatletter
\newcommand*{\IfPGFLibraryLoaded}[1]{%
\ifcsname pgf@library@#1@loaded\endcsname
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
}%
\makeatother
以及随后的内容\begin{document}
:
{\IfPGFLibraryLoaded{fpu}{%
\pgfkeys{/pgf/fpu=false}% switch the FPU off inside this group
}{}%
\tikzpicture\node(1,0){A};\endtikzpicture
}
输出
上面给出的示例文档产生以下输出:
如果注释掉\usepgflibrary{fpu}
和\pgfkeys{/pgf/fpu}
,输出将变成: