关于 tikz 和 fp 包的不兼容性:\FPeval 中的除法 (/) 运算符和 tikz 中的节点

关于 tikz 和 fp 包的不兼容性:\FPeval 中的除法 (/) 运算符和 tikz 中的节点

假设我们想使用 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}

在此处输入图片描述

相关内容