4

我处于最终用户可以自己定义变量名的情况。

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

为了将变量打印为乳胶,我正在使用 sympy.latex 并希望将“tbm”之类的内容与“al”作为索引,但 bm 被翻译为粗体符号。

在此处输入图像描述

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

喜欢:

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

4

2 回答 2

4

的这种自动翻译bmSympy 乳胶打印机( sympy.printing.latex) 执行,特别是在 中声明bm的变量修饰符字典中的条目。我在源代码中看不到在调用时禁用修饰符 dict 的方法;据我所知,不是设置在与字典相同的上下文中的任何地方都没有使用。modifier_dictsympy.printing.latexlatex(expr, **settings)modifier_dict

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

def translate(s):

检查结束字符串的修饰符。如果存在,将修饰符转换为乳胶并递归翻译其余部分。

...

从这个函数的源代码中可以清楚地看出,修饰符字典(递归地)检查参数表达式中的所有条目。


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

也可以看看:

于 2016-01-08T02:04:39.617 回答
1

谢谢@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{方程}

于 2016-01-12T13:45:45.073 回答