
¿Existe alguna razón específica por la que no existe una macro predeterminada (por ejemplo, \pgfmath{<expression>}
) que se expanda directamente al resultado de lo evaluado <expression>
? Siempre me parece particularmente engorroso cuando tengo que escribir \pgfmathparse{\linewidth-2.7cm}\pgfmathresult
sólo para calcular una longitud que sólo se utiliza una vez.
Como este tipo de macros serían muy útiles para cálculos de un solo uso, intenté definir las mías propias, pero fue en vano. ¿Puedes ayudarme con estas definiciones o al menos explicar por qué tal cosa no es posible?
Lo que me molesta es el hecho de que tanto el mío \pgflength
como el predeterminado \pgfmathresult
son solo macros (según \show
) y ambos, en última instancia, se expanden a una secuencia 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}
Respuesta1
\pgfmath
no es expandible, por lo que debe usarse con una macro de salida "conocida" para proporcionar el resultado (para obtener más información sobre el código expandible, consulte, por ejemploTrucos para hacer macros ampliablesy¿Por qué no todo es ampliable?). ElFPU de látex 3es ampliable, por lo que puedes hacerlo
\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}
La FPU LaTeX3 actualmente no tiene la misma cobertura que el pgfmath
código, y algunas cosas nunca serán posibles de manera expandible (por ejemplo, medir el material tipográfico en cajas). La FPU expandible también es más lenta que el código no expandible en muchos casos (aquí se necesita aproximadamente el doble de tiempo para el cálculo, aunque la precisión es mayor).