![关于 tikz 和 fp 包的不兼容性:\FPeval 中的除法 (/) 运算符和 tikz 中的节点](https://linux22.com/image/419205/%E5%85%B3%E4%BA%8E%20tikz%20%E5%92%8C%20fp%20%E5%8C%85%E7%9A%84%E4%B8%8D%E5%85%BC%E5%AE%B9%E6%80%A7%EF%BC%9A%5CFPeval%20%E4%B8%AD%E7%9A%84%E9%99%A4%E6%B3%95%20(%2F)%20%E8%BF%90%E7%AE%97%E7%AC%A6%E5%92%8C%20tikz%20%E4%B8%AD%E7%9A%84%E8%8A%82%E7%82%B9.png)
假设我们想使用 fp 包除以两个数字 u=-60 和 v=3,而不调用 tikz 图片。它工作正常,如下所示:
\documentclass{article}
\usepackage{fp}
\begin{document}
\edef\u{-60}
\edef\v{3}
\FPeval \wd{u/v}
$u/v=\wd$
\end{document}
正确答案将在最后看到:
现在让我们调用 tikz 库将答案放在节点特征中,如下所示:
\documentclass{article}
\usepackage{fp}
\usepackage{tikz}
\begin{document}
\edef\u{-60}
\edef\v{3}
\FPeval \wd{u/v}
$u/v=\wd$
\begin{tikzpicture}
\node at ( 0,0) {$u/v=\wd$};
\end{tikzpicture}
\end{document}
不幸的是,在这种情况下我们会出现错误:
! 不能在 \the 后使用 `the 字符 -'。\wd ->- 20.0000000000000000000 l.11 \node at ( 0,0) {$u/v=\wd$};
- 您知道如何在 tikz 中同时使用 node 和 div(
\
)吗?\FPeval
答案1
不幸的是,当宏的第一个参数已经定义fp
时,没有提供警告用户的选项。\FP...
在 Ti 中使用变量的短名称也是(不幸的)常见做法钾Z. 如果在 内部使用,则可能没有副作用tikzpicture
,因为(非全局)重新定义在tikzpicture
结束时将被取消。
并不总是安全的:在最近的一个问题中,一个用户因为\color
在循环中使用作为变量的名称而遇到了麻烦\foreach
,但是循环代码使用了\textcolor
。
就您而言,您正在重新定义三个现有的控制序列:
\u
代表“短重音”,由此\u{a}
产生 ă;\v
代表“háček”重音,由此\v{c}
产生 č;\wd
是一个原始的 TeX 命令,在多个地方使用,因为它返回一些构建框的宽度。
虽然前两个重新定义在您的示例中是无害的,因为它不包含重音字母,但最后一个是致命的。在某些时候,TeX 被指示进行一些涉及包含要在节点上排版的文本的框的计算,并且它需要该框的宽度,它使用\wd
; 进行查询,但\wd
现在意味着完全不同的东西。
这是另一种方法。名称较长,但输入更清晰。\fpeval
您可以现场进行计算(参见第二个节点)。
\documentclass{article}
\usepackage{xfp} % not fp
\usepackage{tikz}
\ExplSyntaxOn
\NewDocumentCommand{\setfpvar}{mm}
{
\fp_zero_new:c { l_aria_fpvar_#1_fp }
\fp_set:cn { l_aria_fpvar_#1_fp } { #2 }
}
\NewExpandableDocumentCommand{\fpvar}{m}
{
\fp_use:c { l_aria_fpvar_#1_fp }
}
\ExplSyntaxOff
\begin{document}
\setfpvar{u}{-60}
\setfpvar{v}{3}
\setfpvar{wd}{\fpvar{u}/\fpvar{v}}
\begin{tikzpicture}
\node at (0,0) {$u/v=\fpvar{wd}$};
\node at (0,-1) {$u/v=\fpeval{\fpvar{u}/\fpvar{v}}$};
\end{tikzpicture}
\end{document}