結果に直接展開する pgfmath マクロがないのはなぜですか?

結果に直接展開する pgfmath マクロがないのはなぜですか?

\pgfmath{<expression>}評価された の結果に直接展開されるデフォルトのマクロ (例 ) が存在しない特別な理由があるのでしょうか。一度だけ使用される長さを計算するためだけに<expression>入力しなければならないときは、特に面倒だと感じます。\pgfmathparse{\linewidth-2.7cm}\pgfmathresult

このようなマクロは、1 回限りの計算に非常に便利なので、独自のマクロを定義しようとしましたが、うまくいきませんでした。これらの定義について手伝っていただけますか。または、少なくとも、なぜそのようなことができないのかを説明していただけますか。

\pgflength気になるのは、 myと default はどちらも\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 は、多くの場合、拡張不可能なコードよりも低速です (ここでは、精度は高くなりますが、計算に約 2 倍の時間がかかります)。

関連情報