我最初的问题发生在此代码中:
\def\a{pi/2}
\pgfmathparse{\a r}\pgfmathresult
output : 89.99937
当我修改宏\a
时\def\a{pi}
我收到错误:Package PGF Math Error: Unknown function 'pir' (in 'pir')。在这种情况下,一个不令人满意的解决方案是 \def\a{pi/1}
也有可能
\edef\tp{\noexpand \pgfmathparse{pi r}}\tp%
\pgfmathresult
output: 179.99962
尝试修改此 Jake 代码时也会出现此问题如何计算弧度坐标。
杰克给出了这样的答案:
\tikz \draw (1,0) -- ({cos(pi/4 r)}, {sin(pi/4 r)});
但
\def\a{pi}
\tikz \draw (1,0) -- ({cos(\a r)}, {sin(\a r)});
也存在同样的问题。
第一个问题是:如何简单地避免这个问题?或者如何以安全的方式将弧度转换为度?
另一个问题是:是否可以使用xfp
其他工具来进行转换?
答案1
使用\def\a{pi}
或\pgfmathparse{\a r}
会\draw (1,0) -- ({cos(\a r)}, {sin(\a r)})
引发错误,因为 i)在解析表达式之前对其pgfmath
进行了处理,并且 ii)跳过了 (控制字(反斜杠后跟一个或多个 catcode 为 11 的字符))后面的空格。因此,准备解析的表达式始终包含,而不是。\edef
\a
pir
pi r
在问题评论中,
- 我的第一个建议
\def\a{pi\space}
是确保在和\edef
之间留出一个空格(扩展为正常的空格字符)。在控制字后保留空格字符的常用技巧可能pi
r
\space
不行这里:\def\a{pi\ }
不起作用,因为\
它不可扩展并且pgfmath
解析器无法处理它。\def\a{pi}
with\pgfmathparse{\a{} r}
也不起作用,因为{}
之后不会消失\edef
,并且花括号表示pgfmath
表达式中的类似数组的结构。
r
第二个建议是用函数形式替换后缀运算符deg
:cos(\a r)
->cos(deg(pi))
。
这是第三个:您可以将伪常量定义为零参数pgfmath
函数。
\documentclass{article}
\usepackage{tikz}
\makeatletter
% option 1
\tikzset{
declare function={
constA=pi;
}
}
% option 2
\pgfmathdeclarefunction{constB}{0}{%
\begingroup
\pgfmathparse{pi}%
\pgfmathreturn{\pgfmathresult pt}% assign to a length is the most robust way
\endgroup%
}%
\makeatother
\begin{document}
\pgfmathprint{constA r},
\pgfmathprint{constB r}
\tikz \draw (1,0) -- ({cos(constA r)}, {sin(constB r)}) ;
\end{document}
注意,如果函数有一个字母的名称,a
例如declare function={ a=pi; }
那么您将遇到尚未解决的 pgf 问题https://github.com/pgf-tikz/pgf/issues/1077。
顺便说一句,\pgfmathparse
不是完全可扩展的,因此书写\edef\tp{\pgfmathparse{...}}
是危险的,并且不能保证这个\edef
和接下来的使用\tp
在未来的版本中不会出现错误。
另一个问题是:是否可以使用
xfp
其他工具来进行转换?
xfp
是的,这是可能的。\fpeval
(或等效的 latex3 函数\fp_eval:n
)是完全可扩展的(有时比更准确),因此在表达式中pgfmath
使用它是有效的,只是有点奇怪。\fpeval
pgfmath
LaTeX3 模块l3fp
将其定义pi
为正常的 3.1415... 常数,但deg
作为另一个持续的表示每度弧度。因此\pgfmathprint{pi r}
和\fpeval{pi/deg}
进行相同的弧度到度的转换。
\documentclass{article}
\usepackage{pgfmath}
\usepackage{xfp}
\begin{document}
\def\a{pi}
\pgfmathprint{sin(\fpeval{\a/deg})}, % = 0.0
\pgfmathprint{cos(\fpeval{\a/deg})} % = -1.0
\end{document}