2016-08-08 2 views
2

Я подаю sympy.latex строку, содержащую фракции, и я хотел бы получить ее латексное представление с фракциями «сложенными», то есть набирать как 3/2, а не как \ frac {3} {2}. Я устанавливаю аргумент fold_short_fractions ключевое слово для True, но результаты я получаю противоречивы:Латексный принтер Sympy, складывающиеся короткие фракции

>>> from sympy.parsing.sympy_parser import parse_exp 
>>> from sympy import latex 
>>> 
>>> print(latex(parse_expr("3*x**2/y"))) # OK 
\frac{3 x^{2}}{y} 
>>> print(latex(parse_expr("3*x**2/y"), fold_short_frac=True)) # OK 
3 x^{2}/y 
>>> 
>>> print(latex(parse_expr("3/2"))) # OK 
\frac{3}{2} 
>>> print(latex(parse_expr("3/2"), fold_short_frac=True)) # No!! 
\frac{3}{2} 

Как вы можете видеть, он отказывается сложить численную фракцию 3/2, хотя, кажется, все в порядке с символическими выражениями. У кого-нибудь есть объяснение/исправление/обходное решение для этого? Благодаря!

+0

Похоже, ошибка в принтере LaTeX. В частности, он игнорирует эту настройку для рациональных чисел. – asmeurer

ответ

0

Это ошибка в латексном принтере SymPy. Он не рассматривает опцию fold_short_frac для рациональных чисел. У меня есть исправление here.

В то же время, вы можете использовать это в качестве временного решения:

from sympy.printing.latex import LatexPrinter 

class MyLatexPrinter(LatexPrinter): 
    def _print_Rational(self, expr): 
     if expr.q != 1: 
      sign = "" 
      p = expr.p 
      if expr.p < 0: 
       sign = "- " 
       p = -p 
      if self._settings['fold_short_frac']: 
       return r"%s%d/%d" % (sign, p, expr.q) 
      return r"%s\frac{%d}{%d}" % (sign, p, expr.q) 
     else: 
      return self._print(expr.p) 

def latex(expr, **settings): 
    return MyLatexPrinter(settings).doprint(expr) 
Смежные вопросы