
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}\pgfmathresult
um 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 \pgflength
als auch die Standardeinstellung \pgfmathresult
nur 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
\pgfmath
ist 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 pgfmath
Code, 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).