注意:首先,我很抱歉让大家一开始就感到困惑。我希望我终于澄清了一些问题。这个特定问题要求宏来分割 pgfmath 结果。egreg 最初提供的宏就是这样做的。我是在更一般的背景下提出这个问题的别处。
我知道如何在 c++ 中做到这一点,这很容易,但不太清楚如何在 LaTeX 中做到这一点。在这种情况下,我正在使用“pgfplots”,因此我可以访问 pgfmath 例程,因此我不必担心如何删除,pt
因为他们已经为我做了。
我想要没有尾随“。”或“.0”的整数数字,并且我想要没有前面的“0。”的小数数字。
以下 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
在这种情况下打印。