Por que não existe uma macro pgfmath que se expanda diretamente para o resultado?

Por que não existe uma macro pgfmath que se expanda diretamente para o resultado?

Existe um motivo específico para não haver uma macro padrão (por exemplo \pgfmath{<expression>}) que se expanda diretamente para o resultado do avaliado <expression>? Sempre me parece particularmente complicado quando preciso digitar \pgfmathparse{\linewidth-2.7cm}\pgfmathresultapenas para calcular um comprimento que é usado apenas uma vez.

Como essas macros seriam bastante úteis para cálculos descartáveis, tentei definir as minhas próprias, mas sem sucesso. Você pode me ajudar com essas definições ou pelo menos explicar por que tal coisa não é possível?

O que me incomoda é o fato de que tanto o meu \pgflengthquanto o padrão \pgfmathresultsão apenas macros (de acordo com \show) e ambos se expandem para uma sequência de números.:-(

\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}

Responder1

\pgfmathnão é expansível e, portanto, deve ser usado com uma macro de saída 'conhecida' para fornecer o resultado (para saber mais sobre código expansível, veja por exemploTruques para tornar macros expansíveisePor que nem tudo é expansível?). OFPU LaTeX3é expansível e, portanto, você pode fazer

\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}

A FPU LaTeX3 atualmente não tem a mesma cobertura que o pgfmathcódigo, e algumas coisas nunca serão possíveis de forma expansível (por exemplo, medir material composto em caixas). O FPU expansível também é mais lento que o código não expansível em muitos casos (aqui é necessário aproximadamente o dobro do tempo para o cálculo, embora a precisão seja maior).

informação relacionada