
是否有特定原因導致沒有預設巨集(例如\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 也比不可擴展的程式碼慢(這裡計算所需的時間大約是不可擴展的兩倍,儘管精度更高)。