handcalcs
是一个库,可以自动将Python计算代码渲染成Latex,但其方式模仿了用铅笔手写计算的格式:先写出符号公式,然后是数值代入,最后是结果。
由于handcalcs
显示了数值代入过程,计算变得更容易通过手工检查和验证。
你可以使用pip安装:
pip install handcalcs
要安装可选的nbconvert"无输入"导出器,请使用:
pip install "handcalcs[exporters]"
新功能
从v1.9.0版本开始,handcalcs不再安 装"无输入"nbconvert导出器。这是为了减轻handcalcs的安装负担并确保包的适当范围。nbconvert导出器现在"超出范围",并在https://github.com/connorferster/nb-hideinputs单独维护。
%%render
)handcalcs
旨在与Jupyter Notebook或Jupyter Lab一起使用,作为一个_单元格魔法命令_。
首先,导入模块并运行单元格:
import handcalcs.render
注意:这将在Jupyter Notebook中导入
%%tex
和%%render
魔法命令。
然后,在任何你想用handcalcs
渲染的单元格中,只需在单元格顶部使用render单元格魔法命令:
%%render
例如:
%%render a = 2 b = 3 c = 2*a + b/3
就是这样!
渲染后,如果你的系统上安装了Latex环境,你就可以将笔记本导出为PDF。如果你是Latex新手,想在系统上安装它以使用此功能,请参阅wiki中的安装Tex部分。
你还可以使用%%tex
命令将任何Python代码片段转换为有效的LaTex。例如:
首先导入handcalcs
。我们还从__math__包中导入了一些属性/函数,用于下面的示例。
import handcalcs.render from math import sqrt, pi
现在,你也可以使用%%tex
魔法命令!
%%tex a = 2 / 3 * sqrt(pi)
这将产生如下LaTeX输出:
\[ \begin{aligned} a &= \frac{ 2 }{ 3 } \cdot \sqrt{ \pi } = \frac{ 2 }{ 3 } \cdot \sqrt{ 3.142 } &= 1.182 \end{aligned} \]
@handcalc()
感谢@eriknw开发innerscope并主动将其集成到handcalcs
中。谢谢!
首先导入@handcalc()
装饰器:
from handcalcs.decorator import handcalc
@handcalc([override: str = "", precision: int = 3, left: str = "", right: str = "", jupyter_display: bool = False])
返回一个由 (latex_code: str, locals: dict)
组成的元组,其中 locals
是函数命名空间内所有变量的字典。
override
是表示可接受的覆盖标签之一的字符串(见下文)precision
是一个整数,用于改变显示的小数精度left
和 right
是可以在编码后的 Latex 字符串前后添加的字符串,如 \\[
和 \\]
或 $
和 $
jupyter_display
为 True 时,将只返回 locals
字典,而会使用 IPython.display
中的 display(Latex(latex_code))
显示编码后的 Latex 字符串渲染。如果不在 Jupyter 环境中使用,将会返回错误record
为 True 时,将激活 HandcalcsCallRecorder
以允许函数"回溯"先前的输出(见下文)v1.8.0 新功能在你装饰的函数中,从 def my_calc(...)
到 return 语句(如果有)之间的所有内容现在就像 Jupyter 单元格中的代码,只不过它是一个标准的 Python 函数。
以这种方式使用时,你可以使用 @handcalc()
来动态生成 Latex 代码,以在 Jupyter 和非 Jupyter Python 环境(如 streamlit)中显示。
HandcalcsCallRecorder
是一种新的函数包装器,可以通过 @handcalc
装饰器使用。要激活它,请在装饰器函数的参数中选择 record=True
。
其预期用例是在迭代过程中。在工程中,通常需要在表格或 DataFrame 中计算大量值。表格本身包含计算结果,但不一定显示计算步骤。HandcalcsCallRecorder
允许你显示已由装饰函数处理的计算迭代之一的计算过程,如下例所示:
这是 handcalcs 的一个重要新版本,引入了全局配置功能。这允许用户控制 handcalcs 工作方式的多个选项。配置选项及其默认值如下:
decimal_separator = "."
latex_block_start = "\\["
latex_block_end = "\\]"
math_environment_start = "aligned"
math_environment_end = "aligned"
line_break = "\\\\[10pt]"
use_scientific_notation = False
display_precision = 3
underscore_subscripts = True
greek_exclusions = []
param_columns = 3
preferred_string_formatter = "L"
custom_symbols = {}
import handcalcs.render handcalcs.set_option("display_precision", 4) handcalcs.set_option("param_columns", 5) handcalcs.set_option("line_break", "\\\\[20pt]") handcalcs.set_option("greek_exclusions", ["psi"]) # 等等...
这些更改现在会影响当前会话中渲染的所有单元格。如果你想永久更新 config.json
文件以保存这些更改(这样 handcalcs 在下次启动时就会使用这些选项),你可以调用 handcalcs.save_config()
,这些更改将被保存(并在下一个会话中立即可用)。
你现在可以向全局配置添加自定义符号,以处理 handcalcs 未考虑到的所有情况。
例如:
handcalcs.set_option("custom_symbols", {"V_dot": "\\dot{V}", "N_star": "N^{*}"})
现在将允许这种渲染:
handcalcs.set_option()
函数的文档字符串展示了可用的选项及其取值。
handcalcs
对你希望如何格式化计算做出了某些假设,在这方面不允许进行大量定制。然而,目前有四种定制可以使用 # override tags
作为 %%render
单元格魔术后的参数来实现。此外,你还可以指定要显示的小数精度。每个单元格只能使用一个覆盖标签,但你可以将覆盖标签与精度设置结合使用。
覆盖标签可以与 Jupyter 单元格魔术和函数装饰器一起使用。要在装饰器中使用覆盖标签,只需将其作为参数提供,例如 @handcalc(override='params', precision=2)
我将比较二次方程公式的基本渲染(如下)与每个覆盖标签实现的变化。
params
:handcalcs
垂直渲染代码行,一行接一行。然而,当你分配变量或显示结果变量时,你可能不想浪费所有的垂直空间。
使用 params
覆盖标签,你的参数列表将改为以三列渲染,从而节省垂直空间。此外,只会显示结果,不会显示计算过程。
单元格中的小数位数可以通过在%%render
后提供一个整数来调整,以指示要显示的小数精度。可以与其他覆盖标签组合使用。
long
和short
:为了节省垂直空间,handcalcs
会尝试判断计算的长度,如果足够短,就会将其完整地呈现在一行上。
如果handcalcs
的内部测试认为计算太长而无法放在一行上,它会将其分成多行。
使用# long
或# short
覆盖标签可以覆盖长度检查,并以"长"格式或"短"格式显示单元格中的所有计算。例如:
long:跨多行展示,就像你有一个长方程一样
short:强制显示在单行上,就像你有一个短方程一样
# "短"计算的格式(可以放在一行中): c = 2*a + b/3 = 2*(2) + (3)/3 = 5 # "长"计算的格式(需要多行格式) c = 2*a + b/3 = 2*(2) + (3)/3 = 5