
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}\pgfmathresult
apenas 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 \pgflength
quanto o padrão \pgfmathresult
sã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
\pgfmath
nã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 pgfmath
có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).