笔记:我已将这个问题从变得非常复杂的讨论中分离出来。我知道 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
。