Warum gibt es kein pgfmath-Makro, das direkt zum Ergebnis expandiert?

Warum gibt es kein pgfmath-Makro, das direkt zum Ergebnis expandiert?

Gibt es einen bestimmten Grund dafür, dass es kein Standardmakro (z. B. \pgfmath{<expression>}) gibt, das direkt zum Ergebnis des ausgewerteten erweitert wird <expression>? Ich finde es immer besonders umständlich, wenn ich nur tippen muss, \pgfmathparse{\linewidth-2.7cm}\pgfmathresultum eine Länge zu berechnen, die nur einmal verwendet wird.

Da solche Makros für einmalige Berechnungen recht praktisch wären, habe ich versucht, meine eigenen zu definieren, aber ohne Erfolg. Können Sie mir bei diesen Definitionen helfen oder zumindest erklären, warum so etwas nicht möglich ist?

Was mich stört ist die Tatsache, dass sowohl meine \pgflengthals auch die Standardeinstellung \pgfmathresultnur Makros sind (laut \show) und sich beide letztendlich zu einer Zahlenfolge erweitern.:-(

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

Antwort1

\pgfmathist nicht erweiterbar und muss daher mit einem „bekannten“ Ausgabemakro verwendet werden, um das Ergebnis zu liefern (weitere Informationen zu erweiterbarem Code finden Sie beispielsweise unterTricks, um Makros erweiterbar zu machenUndWarum ist nicht alles erweiterbar?). DerLaTeX3 FPUist erweiterbar, und so können Sie tun

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

Die LaTeX3-FPU hat derzeit nicht die gleiche Abdeckung wie der pgfmathCode, und manche Dinge werden nie erweiterbar möglich sein (z. B. das Messen von in Kästen gesetztem Material). Die erweiterbare FPU ist in vielen Fällen auch langsamer als nicht erweiterbarer Code (hier wird für die Berechnung etwa die doppelte Zeit benötigt, obwohl die Genauigkeit höher ist).

verwandte Informationen