我处于最终用户可以自己定义变量名的情况。
例如:名为“tbm_al”的变量是正确的。
为了将变量作为乳胶打印,我使用sympy.latex并期望像“tbm”这样的“al”作为indice,但是bm是用boldsymbol翻译的。
是否有办法让“tbm”与indice“al”同时使用t(粗体)和indice al以及tbm_al作为字符串?
像:
\开始{方程*} \ {开始方程}的 {TBM} _ {人} \ {端方程} \ {端方程*}
答案 0 :(得分:4)
bm
的{{1}}自动翻译由Sympy latex printer(sympy.printing.latex
)执行,特别是bm
是变量修饰词典modifier_dict
中的一个条目sympy.printing.latex
。我认为在源代码中没有办法在调用latex(expr, **settings)
时禁用修饰符dict;从我所看到的情况来看,在modifier_dict
词典的相同上下文中,任何设置都不会被使用。
看看例如源中的函数translate(s)
:
def translate(s):
检查结束字符串的修饰符。如果存在,转换 乳胶的修饰符并递归地翻译其余部分。
...
从这个函数的来源,很清楚,对于参数表达式中的所有条目,将(递归地)检查修饰符字典 。
然后,剩下的选项是手动修改自己的modifier_dict
自定义源副本中的名称修饰符(sympy.printing.latex
)(或者,在原始文件中),只需删除字典条目即可对于密钥bm
。当然,这是除非你想在其他地方使用bm
。
另见:
答案 1 :(得分:1)
Thx到@dfri。我决定在latex translation期间清除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")
\开始{方程} tbm_ {人} \ {端方程}
使用“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")
\开始{方程} TBM _ {\酒吧{A}} \ {端方程}