
Есть ли конкретная причина, по которой нет макроса по умолчанию (например, \pgfmath{<expression>}
), который напрямую расширяется до результата вычисленного <expression>
? Мне всегда кажется особенно громоздким, когда мне приходится печатать \pgfmathparse{\linewidth-2.7cm}\pgfmathresult
только для того, чтобы вычислить некоторую длину, которая используется только один раз.
Поскольку такие макросы были бы весьма полезны для одноразовых вычислений, я попытался определить свои собственные, но безуспешно. Можете ли вы помочь мне с этими определениями или хотя бы объяснить, почему это невозможно?
Меня беспокоит тот факт, что и мой, \pgflength
и стандартный \pgfmathresult
являются всего лишь макросами (согласно \show
) и оба в конечном итоге расширяются до последовательности чисел.:-(
\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}
решение1
\pgfmath
не расширяется, поэтому должен использоваться с «известным» выходным макросом для предоставления результата (подробнее о расширяемом коде см., например,Хитрости, позволяющие сделать макросы расширяемымииПочему не все можно расширить?).LaTeX3 FPUрасширяемо, и поэтому вы можете сделать
\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}
LaTeX3 FPU в настоящее время не имеет того же покрытия, что и pgfmath
код, и некоторые вещи никогда не будут возможны в расширяемом виде (например, измерение материала, набранного в коробки). Расширяемый FPU также медленнее нерасширяемого кода во многих случаях (здесь для расчета требуется примерно в два раза больше времени, хотя точность выше).