在基本 LaTeX 中将任意格式的小数分成整数和小数部分

在基本 LaTeX 中将任意格式的小数分成整数和小数部分

笔记:我已将这个问题从变得非常复杂的讨论中分离出来。我知道 egreg 已经有了解决方案,所以我会等到他在这里发布解决方案。

问题:解决方案必须采用任意形式的十进制数,即,维度/长度变量、纯文本\def、数字字符串等,并且仅使用基本 LaTeX 分离出整数部分和小数部分的数字,前面不带“。”或“0”。 让该解决方案的用户以任何他们喜欢的方式格式化这些结果。

相关问题pgfmath这里pgfmath例程会帮您切断pt。在这种情况下,您只需要一个读取\pgfmathresult或类似的宏。

答案代码输出

我的 MWE 提出了一个有限的解决方案,这是我在 E.Ellett 和 egreg 的帮助下想出来的,当时他们还不知道我想要的有多通用。它提供了两个读取长度变量的例程,即一个用 声明的例程\newlength{\thelength},但正如 egreg 指出的那样,它的扩展能力仍然有限。

MWE 代码

\documentclass[border=5mm]{standalone}

\makeatletter

\def\my@get@length#1{\edef\pure@length{\strip@pt#1}}

\def\printplainbefore#1{\my@get@length#1\expandafter\@printint\pure@length..\@nil}
\def\@printint#1.#2.#3\@nil{#1}
\def\printplainafter#1{\my@get@length#1\expandafter\@printfrac\pure@length..\@nil}
\def\@printfrac#1.#2.#3\@nil{#2}

\makeatother

\newlength{\thislength}
\setlength{\thislength}{123.456pt}
\tracingmacros=1

\begin{document}
The: \the\thislength\quad
Split: \printplainbefore{\thislength} -- \printplainafter{\thislength}
\end{document}

答案1

以下是在使用 pgfmath 将十进制数仅分离为整数和小数部分它接受 和 的参数\printplainbefore,以及\printplainafter长度或跳过参数或扩展为长度的宏(请参阅最后一次调用\test)。我使用了\dimexpr,因此需要 e-TeX。

\documentclass{article}

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

\makeatletter
\begingroup\catcode`P=12 \catcode`T=12 \lowercase{\endgroup

\def\printplainbefore#1{%
  \expandafter\geoff@strip@pt\expandafter\@printplainbefore\the\dimexpr#1PT\relax\@nil
}
\def\printplainafter#1{%
  \expandafter\geoff@strip@pt\expandafter\@printplainafter\the\dimexpr#1PT\relax\@nil
}
\def\@printplainbefore#1.#2.#3PT\@nil{#1}
\def\@printplainafter#1.#2.#3PT\@nil{#2}

\def\geoff@strip@pt#1#2PT#3\@nil{#1#2..PT\@nil}

} % balance the open brace after \lowercase
\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}

\printplainbefore{\baselineskip} -- \printplainafter{\baselineskip}

\printplainbefore{\medskipamount} -- \printplainafter{\medskipamount}

\printplainbefore{12.34pt} -- \printplainafter{12.34pt}

\def\test{12.34pt}

\printplainbefore{\test} -- \printplainafter{\test}
\end{document}

在此处输入图片描述

笔记

使用这个广义宏无法区分整数或小数部分为空的情况。因此\printplainbefore{.1}\printplainbefore{0.1}将给出相同的结果0

相关内容