在Python中使用LaTeX符号格式化数字

17

使用Python中的格式化字符串,我可以轻松地将一个数字打印为“科学计数法”,例如:

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

如何在LaTeX格式中以最简单的方式格式化数字,例如1\times10^{+09}?


我认为1^{+09}不是你想要的输出,但无论如何。 - walkytalky
当然是真的,我指的是10^{+09}。 - pafcu
3个回答

28

使用siunitx LaTeX 包可以帮助您解决此问题,它允许您直接使用Python浮点数值,而无需解析结果字符串并将其转换为有效的LaTeX。

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

当LaTeX文档编译时,以上代码将转换为enter image description here。正如andybuckley在评论中指出的那样,加号可能不会被siunitx接受(我没有测试过),因此可能需要对结果进行.replace("+", "")操作。

如果无法使用siunitx,可以编写一个自定义函数,如下所示:

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}'

不错的解决方案!这做到了所要求的,但是在数学正确性格式化时,在指数中包含+号或前导零并不正常(参见siunitx输出)。此外,由于\times命令,最好使用原始(“r”)字符串。可以通过将第一个返回替换为以下内容来完成: parts = float_str.split("e"); return r"{0} \times 10^{{{1}}}".format(parts[0], int(parts[1])) (希望这是可以理解的:SO在注释中不会进行代码格式化!) - andybuckley
@andybuckley 感谢您的反馈!我已经纠正了我的答案。 - Lauritz V. Thaulow
我也不确定siunitx处理什么输入,只知道它的输出是在正常的数学格式中,指数中没有显式的加号或前导0。我在上面的评论中的内联代码片段(可悲的是)是我能想到的最优雅的将指数强制转换为整数的方法...也许itertools中有一些奇怪的东西可以用来处理这些问题,但希望这种方式足够清晰明了! - andybuckley
@andybuckley 如果我们将指数和底数都映射为int(据我所知,没有理由不这样做),我们可以使它更加优雅。请参见上文。 :) - Lauritz V. Thaulow
在这种情况下,latex_float(1.234e9)会发生什么?或者我漏掉了一些明显的东西吗?!显然,幂为整数的尾数对于1e9这个特定情况有效 :-) - andybuckley
@andybuckley,是我错过了些显而易见的东西。我不知道当时在想什么。已经改正了。 - Lauritz V. Thaulow

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))

5
安装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模块(num2tex)会对我的工作流程更好,因此我在GitHub上创建了它,并在PyPI上注册。我很想听取如何使其更有用的反馈意见。


你提供的软件包和GitHub页面上的示例非常有用!干杯,伙计。 :) - Matt
如果您能抽出一些时间来实现\cdot 10^{p}选项,那就太好了。 :) - Matt
@Matt,它已经有这个功能了,我只是没有记录它 :) 请查看我的编辑答案以了解如何使用cdot进行操作。 - MountainDrew
1
很抱歉,该软件包存在一个小错误。举个例子,num2tex(100000,precision=1)将输出$\times 10^5$,省略了“1”。当精度$\leq n+1$时,对于任何$10^n$都会发生这种情况(但如果$a\neq 1$,则不适用于$a.10^n$)。 - Matt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接