Как попросить 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 _{\ бар {а}}\ конец {уравнение}

Другие вопросы по тегам