Как попросить sympy не переводить bm в boldsymbol?
Я нахожусь в ситуации, когда конечный пользователь может определить имя переменной самостоятельно.
Например: переменная с именем "tbm_al" является правильной.
Чтобы напечатать переменную как латекс, я использую sympy.latex и ожидаю иметь что-то вроде "tbm" с "al" в качестве индекса, но bm переводится как boldsymbol.
Есть ли способ иметь как "tbm" с индексом "al", так и ни t (жирный шрифт) с indice al, ни tbm_al в качестве строки?
лайк:
\ begin {уравнение *}\begin{уравнение}{tbm} _ {al}\ end {уравнение}\end{уравнение *}
2 ответа
Это автоперевод bm
выполняется латексным принтером Sympy (sympy.printing.latex
), конкретно как bm
это запись в словаре модификаторов переменных modifier_dict
объявлено в sympy.printing.latex
, Я не вижу способа в источнике отключить использование модификатора dict при вызове latex(expr, **settings)
; из того, что я вижу, не настройки нигде не используются в том же контексте, что и modifier_dict
толковый словарь.
Посмотрите, например, на функцию translate(s)
в источнике:
def translate(s):
Проверьте модификатор, заканчивающий строку. Если есть, конвертируйте модификатор в латекс и переводите остальные рекурсивно.
...
Из источника этой функции совершенно ясно, что словарь модификаторов будет проверен (рекурсивно) для всех записей в выражении аргумента.
Оставшаяся опция будет тогда вручную изменять модификаторы имени (modifier_dict
) в вашем собственном исходном экземпляре sympy.printing.latex
(или, альтернативно, в оригинале), просто удалив словарную запись для ключа 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")
\ {Начинают уравнение}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 _{\ бар {а}}\ конец {уравнение}