如何要求 sympy 不要将 bm 翻译成 boldsymbol?

How to ask sympy to don't translate bm to boldsymbol?

我处在终端用户可以自己定义变量名的情况下。

例如:一个名为"tbm_al"的变量是正确的。

为了将变量打印为乳胶,我正在使用 sympy.latex 并期望有类似 "tbm" 和 "al" 作为索引的东西,但 bm 被翻译成粗体符号。

有没有办法让 "tbm" 和索引 "al" 都没有 t(粗体)和索引 al 也没有 tbm_al 作为字符串?

喜欢:

\begin{方程式*}\begin{方程式}{tbm}_{al}\end{方程式}\end{方程式*}

bm 的自动翻译由 Sympy latex printer (sympy.printing.latex) 执行,具体来说 bm 是变量修饰符字典 modifier_dict 中的一个条目在 sympy.printing.latex 中声明。我在源代码中看不到在调用 latex(expr, **settings) 时禁用修饰符 dict 的方法;据我所知,在与 modifier_dict 字典相同的上下文中,没有任何地方使用设置。

看看例如源代码中的函数 translate(s)

def translate(s):

Check for a modifier ending the string. If present, convert the modifier to latex and translate the rest recursively.

...

从这个函数的源代码来看,很明显修饰符字典 检查(递归地)参数表达式中的所有条目。


剩下的选择是手动修改您自己自定义的 sympy.printing.latex 源副本(或者,在原始副本中)中的名称修饰符 (modifier_dict),方法是简单地删除关键字 bm 的字典条目。当然,除非您想在其他地方使用 bm

另请参阅:

感谢@dfri。我决定在乳胶翻译过程中清除 modifier_dict。

from sympy.printing.latex import modifier_dict
from sympy import latex
def cancel_sympy_translate(f):
    def wrapper(*args, **kwargs):
        saved_dict = dict(modifier_dict)
        modifier_dict.clear()
        result = f(*args, **kwargs)
        modifier_dict.update(saved_dict)
        return result
    return wrapper

latex = cancel_sympy_translate(latex)

t = Symbol("tbm_al")
print latex(t, mode="equation")

\begin{方程}tbm_{al}\end{方程}

与"keep_translate_keys"。 (由@dfri 建议)

def cancel_sympy_translate(f, keep_translate_keys=None):

    keep_translate_keys = keep_translate_keys or []

    def remove_unwanted_keys(modif_dict):
        for k in modif_dict.keys():
            if k in keep_translate_keys:
                continue
            del modif_dict[k]

    def wrapper(*args, **kwargs):
        saved_dict = dict(modifier_dict)
        remove_unwanted_keys(modifier_dict)
        result = f(*args, **kwargs)
        modifier_dict.update(saved_dict)
        return result

    return wrapper

latex = cancel_sympy_translate(latex, keep_translate_keys=["bar"])
t = Symbol("tbm_abar")
print latex(t, mode="equation")

\begin{方程}tbm_{\bar{a}}\end{方程}