为什么没有直接扩展结果的 pgfmath 宏?

为什么没有直接扩展结果的 pgfmath 宏?

有没有特定的原因导致没有默认宏(例如\pgfmath{<expression>})直接扩展为求值的结果<expression>?当我必须键入内容\pgfmathparse{\linewidth-2.7cm}\pgfmathresult以计算仅使用一次的长度时,我总是觉得特别麻烦。

由于此类宏对于一次性计算非常有用,因此我尝试定义自己的宏,但无济于事。您能帮我解释这些定义吗,或者至少解释一下为什么这样的事情是不可能的?

令我困扰的是,我的\pgflength和默认都\pgfmathresult只是宏(根据\show),并且最终都会扩展为一系列数字。:-(

\documentclass{article}

\usepackage{pgf}

\newcommand\pgfmath[1]{\pgfmathparse{#1}\pgfmathresult}
\newcommand\pgftrunc[1]{\pgfmathparse{int(#1)}\pgfmathresult}
\newcommand\pgflength[1]{\pgfmathparse{#1}\pgfmathresult pt}

\begin{document}
% Fails:
%\hspace{\pgflength{1cm+2cm}}

% Error message:
% ! Missing number, treated as zero.
% <to be read again> 
%                  \begingroup 
% l.14     \hspace{\pgflength{1cm+2cm}}

% Works:
\pgfmathparse{1cm+2cm}
\hspace{\pgfmathresult pt}

% Curiously this also fails:
%\edef\mylength{\pgflength{1cm+2cm}}

% Error message:
% ! Incomplete \iffalse; all text was ignored after line 24.
% <inserted text> 
%                 \fi 

\end{document}

答案1

\pgfmath不可扩展,因此必须与“已知”输出宏一起使用才能提供结果(有关可扩展代码的更多信息,请参见使宏可扩展的技巧为什么并非所有事物都可扩展?)。 这LaTeX3浮点运算单元是可扩展的,所以你可以

\documentclass{article}

\usepackage{expl3}
\ExplSyntaxOn
\newcommand{\fpmath}[1]{\fp_eval:n{#1}}
\newcommand{\fptrunc}[1]{\fp_to_int:n{#1}}
\newcommand{\fplength}[1]{\fp_eval:n{#1}~pt~}
\ExplSyntaxOff

\begin{document}
\hspace{\fplength{1cm+2cm}}

\edef\mylength{\fplength{1cm+2cm}}

\end{document}

LaTeX3 FPU 目前不具备与pgfmath代码相同的覆盖范围,有些事情永远无法以可扩展的方式实现(例如测量排版成框的材料)。可扩展 FPU 在许多情况下也比不可扩展的代码慢(这里计算所需的时间大约是非可扩展代码的两倍,尽管精度更高)。

相关内容