為什麼沒有直接擴展結果的 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 FPU是可擴展的,所以你可以這樣做

\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 也比不可擴展的程式碼慢(這裡計算所需的時間大約是不可擴展的兩倍,儘管精度更高)。

相關內容