Почему нет макроса 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 также медленнее нерасширяемого кода во многих случаях (здесь для расчета требуется примерно в два раза больше времени, хотя точность выше).

Связанный контент