使用 pgfmath 将十进制数仅分离为整数和小数部分

使用 pgfmath 将十进制数仅分离为整数和小数部分

注意:首先,我很抱歉让大家一开始就感到困惑。我希望我终于澄清了一些问题。这个特定问题要求宏来分割 pgfmath 结果。egreg 最初提供的宏就是这样做的。我是在更一般的背景下提出这个问题的别处

我知道如何在 c++ 中做到这一点,这很容易,但不太清楚如何在 LaTeX 中做到这一点。在这种情况下,我正在使用“pgfplots”,因此我可以访问 pgfmath 例程,因此我不必担心如何删除,pt因为他们已经为我做了。

我想要没有尾随“。”或“.0”的整数数字,并且我想要没有前面的“0。”的小数数字。

以下 MWE 显示了我这样做的失败尝试。

输出

MWE 输出

代码

\documentclass[12pt]{article}
\usepackage[a5paper,margin=14mm]{geometry}

\usepackage{pgfplots}

\pgfplotsset{compat=1.9, /pgf/declare function={F(\x)=(\x+5)*(\x-1)*(\x-5);}}

\newlength{\printvar}

\newcommand{\intprint}[1]{\pgfmathparse{int(#1)}\pgfmathresult}
\newcommand{\fracprint}[1]{\pgfmathparse{frac(#1)}\pgfmathresult}

\newcommand{\truncprint}[1]{\pgfmathtruncatemacro{\printvar}{#1}\pgfmathprint{\printvar}}
\newcommand{\diffprint}[1]{\pgfmathtruncatemacro{\printvar}{#1}\pgfmathprint{#1-\printvar}}

\begin{document}
\par PGFMathParse F(1.5): \pgfmathparse{F(1.5)}\pgfmathresult
\par TruncPrint: \truncprint{F(1.5)}\quad DiffPrint \diffprint{F(1.5)}
\par IntPrint: \intprint{F(1.5)}\quad FracPrint \fracprint{F(1.5)}
\end{document}

答案1

当你这样做

\pgfmathparse{sqrt(2)}\printplainbefore\pgfmathresult.777

TeX 遵循指令。它将 放置1.41421为替换文本\pgfmathresult并继续扩展\printplainbefore;根据其定义,第一个参数是\pgfmathresult,第二个参数是,.777如 TeX 在设置 时所示\tracingmacros=1

\pgfmathresult ->1.41421

\printplainbefore #1.#2 ->#1
#1<-\pgfmathresult
#2<-777

所以你得到1.41421结果。请记住 TeX绝不在吸收参数时会扩展标记。如果你这样做

\pgfmathparse{sqrt(2)}\expandafter\printplainbefore\pgfmathresult

您会得到一个错误,这是由于您决定如何分隔第二个参数所致。使用空格作为最后的分隔符通常是一个非常糟糕的选择。

\printplainbefore假设的参数始终是一个明确的数字或​​一个扩展为该数字的控制序列,则可以这样做:

\makeatletter
\def\printplainbefore#1{\expandafter\@printplainbefore#1..\@nil}
\def\@printplainbefore#1.#2.#3\@nil{#1}
\def\printplainafter#1{\expandafter\@printplainafter#1..\@nil}
\def\@printplainafter#1.#2.#3\@nil{#2}
\makeatother

完整示例:

\documentclass[12pt]{article}
\usepackage[a5paper,margin=14mm]{geometry}

\usepackage{pgfplots}
\pgfplotsset{compat=1.9}

\makeatletter
\def\printplainbefore#1{\expandafter\@printplainbefore#1..\@nil}
\def\@printplainbefore#1.#2.#3\@nil{#1}
\def\printplainafter#1{\expandafter\@printplainafter#1..\@nil}
\def\@printplainafter#1.#2.#3\@nil{#2}
\makeatother

\begin{document}

\printplainbefore{1.41421} -- \printplainafter{1.41421}

\pgfmathparse{sqrt(2)}
\printplainbefore{\pgfmathresult} -- \printplainafter{\pgfmathresult}

\printplainbefore{1} -- \printplainafter{1}

\printplainbefore{.1} -- \printplainafter{.1}

\printplainbefore{0.1} -- \printplainafter{0.1}

\end{document}

您可能需要添加检查来判断两个部分中有一个是否为空,然后决定0在这种情况下打印。

在此处输入图片描述

相关内容