有没有特定的原因导致没有默认宏(例如\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 在许多情况下也比不可扩展的代码慢(这里计算所需的时间大约是非可扩展代码的两倍,尽管精度更高)。