评论

评论

我想避免\usepackage[nomessages]{fp}使用

\FPeval\height{round(6*sin(pi/3):6)}%
\begin{pspicture}(6,\height)

只是为了获得更紧凑的代码,即不使用临时变量\height。实际上使用上述方法并不是一个大问题,但我只是好奇我是否可以使其更紧凑。

我想要实现的是检查PGF中是否存在有用的包,以便我可以按如下方式重写上述代码。

\begin{pspicture}(6,6*sin(pi/3))

见过有人用calc,不过还没试过,完整代码如下。

\documentclass[pstricks,border=12pt]{standalone}
\SpecialCoor
\usepackage[nomessages]{fp}

\begin{document}
% not so compact
\FPeval\height{round(6*sin(pi/3):6)}%
\begin{pspicture}(6,\height)
\pspolygon(6,0)(6;60)
\end{pspicture}

% preferred
\begin{pspicture}(6,6*sin(pi/3))
\pspolygon(6,0)(6;60)
\end{pspicture}
\end{document}

欢迎任何建议。

答案1

评论

您可以使用l3fp支持许多内置函数的程序。它由 自动加载xparse

让我们看一下定义并详细说明它的作用

\DeclareExpandableDocumentCommand{\eval}{m}{ \fp_to_decimal:n {#1} }
  1. \DeclareExpandableDocumentCommand是‘可扩展的’,允许\eval在 TeX‘期望’数字的地方使用:大多数文档命令应该是‘受保护的’,这就是它的作用\NewDocumentCommand
  2. {\eval}是新宏的名称。
  3. {m}代表一个任意参数(o对于可选,s对于星号)。
  4. { \fp_to_decimal:n {#1} }是 的定义\eval。它使用第一个参数\fp_to_decimal来调用。冒号后面的 代表 所期望的值的类型;代表带括号的标记列表。l3fp#1n\fp_to_decimaln

执行

\documentclass[pstricks,border=12pt]{standalone}
\SpecialCoor

% FP
\usepackage[nomessages]{fp}

% l3fp
\usepackage{xparse}
\ExplSyntaxOn
\DeclareExpandableDocumentCommand{\eval}{m}{ \fp_to_decimal:n {#1} }
\ExplSyntaxOff

% PGF
\usepackage{tikz}

\begin{document}
% FP
\FPeval\height{round(6*sin(pi/3):6)}%
\begin{pspicture}(6,\height)
\pspolygon(6,0)(6;60)
\end{pspicture}

% l3fp
\begin{pspicture}(6,\eval{6*sin(pi/3)})
\pspolygon(6,0)(6;60)
\end{pspicture}

% PGF
% don't forget "r" to tell PGF, that the argument is in radians
\pgfmathparse{6*sin(pi/3 r)}
\begin{pspicture}(6,\pgfmathresult)
\pspolygon(6,0)(6;60)
\end{pspicture}
\end{document}

相关内容