13

在 Python 中使用格式字符串我可以轻松地以“科学记数法”打印一个数字,例如

>> print '%g'%1e9
1e+09

以 LaTeX 格式格式化数字的最简单方法是什么,即 1\times10^{+09}?

4

3 回答 3

23

siunitx LaTeX 包为您解决了这个问题,它允许您直接使用 python 浮点值,而无需解析结果字符串并将其转换为有效的 LaTeX。

>>> print "\\num{{{0:.2g}}}".format(1e9)
\num{1e+09}

当 LaTeX 文档编译后,上面的代码会变成 在此处输入图像描述. 正如 andybuckley 在评论中指出的那样,加号可能不被 siunitx 接受(我没有测试过),所以可能有必要对.repace("+", "")结果做 a 。

如果 usingsiunitx不知何故,请编写如下自定义函数:

def latex_float(f):
    float_str = "{0:.2g}".format(f)
    if "e" in float_str:
        base, exponent = float_str.split("e")
        return r"{0} \times 10^{{{1}}}".format(base, int(exponent))
    else:
        return float_str

测试:

>>> latex_float(1e9)
'1 \\times 10^{9}'
于 2012-11-21T09:57:06.377 回答
5

你可以写一个frexp10函数:

def frexp10(x):
    exp = int(math.floor(math.log10(abs(x))))
    return x / 10**exp, exp

然后以 LaTeX 样式格式化:

'{0}^{{{1:+03}}}'.format(*frexp10(-1.234e9))
于 2012-11-21T10:04:02.740 回答
4

安装num2tex

pip install num2tex

并这样使用它:

>>> from num2tex import num2tex
>>> '{:.0e}'.format(num2tex(1e9))
'1 \\times 10^{9}'

num2tex继承自,str因此format可以以相同的方式使用该函数。

您还可以使用更改指数的格式num2tex.configure()(添加此以响应@Matt 的评论)。

>>>from num2tex import num2tex
>>>from num2tex import configure as num2tex_configure
>>>num2tex_configure(exp_format='cdot')
>>>num2tex(1.3489e17)
'1.3489 \cdot 10^{17}'
>>>num2tex_configure(exp_format='parentheses')
'1.3489 (10^{17})'

截至目前,这在 GitHub 中没有记录,我会尽快尝试更改它!

免责声明:在使用(并支持)Lauritz V. Thaulow 的答案一段时间后(对于 Jupyter、Matplotlib 等),我认为编写一个简单的 Python 模块对我的工作流程会更好,所以我在GitHub 上创建了 num2tex并在派皮。我很想得到一些关于如何使它更有用的反馈。

于 2019-02-06T15:44:33.077 回答