source: pyromaths/trunk/fuentes/src/pyromaths/outils/Affichage.py @ 423

Last change on this file since 423 was 423, checked in by mabarracus, 4 years ago

add sources from pyromaths 15.10

File size: 6.7 KB
Line 
1#!/usr/bin/python
2# -*- coding: utf-8 -*-
3#
4# Pyromaths
5# Un programme en Python qui permet de créer des fiches d'exercices types de
6# mathématiques niveau collège ainsi que leur corrigé en LaTeX.
7# Copyright (C) 2006 -- Jérôme Ortais (jerome.ortais@pyromaths.org)
8#
9# This program is free software; you can redistribute it and/or modify
10# it under the terms of the GNU General Public License as published by
11# the Free Software Foundation; either version 2 of the License, or
12# (at your option) any later version.
13#
14# This program is distributed in the hope that it will be useful,
15# but WITHOUT ANY WARRANTY; without even the implied warranty of
16# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17# GNU General Public License for more details.
18#
19# You should have received a copy of the GNU General Public License
20# along with this program; if not, write to the Free Software
21# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
22#
23
24# import re
25from pyromaths.classes import Racine
26from pyromaths.classes.Fractions import Fraction
27
28from .decimaux import decimaux
29
30
31def tex_coef(coef, var='', bplus=0, bpn=0, bpc=0):
32    r"""**tex_coef**\ (*coef*\ [, *var*\ [, *bplus*\ [, *bpn*\ [, *bpc*\ ]]]])
33
34    Gère l'affichage d'un monôme (par défaut de degré 0) au format TeX. Permet
35
36    * d'écrire `3x` au format TeX
37    * d'ajouter un `+` devant `3x` pour écrire la somme `2+3x` avec `bplus`
38    * de mettre des parenthèses autour de `-3x` pour écrire le produit `(x+1)(-3x)` avec `bpn` alors qu'il n'en faut pas avec `(x+1)3x`
39    * de mettre des parenthèses autour de 3x pour écrire la puissance `(3x)^2` avec `bpc` alors qu'il n'en faut pas pour `x^2`
40
41    :param coef: est le coefficient à écrire devant la variable var
42    :type coef: integer
43    :param bplus: si vrai, il faut écrire le signe + devant le coefficient
44    :type bplus: boolean
45    :param bpn: si vrai, il faut mettre des parenthèses autour de l'écriture si *coef* est négatif.
46    :type bpn: boolean
47    :param bpc: si vrai, il faut mettre des parenthèses autour de l'écriture si `coef != 0 ou 1` et `var != ''`
48    :type bpc: boolean
49
50    >>> from pyromaths.outils import Affichage
51    >>> Affichage.tex_coef(5,'x')
52    '5\\,x'
53    >>> Affichage.tex_coef(5,'x',1)
54    '+5\\,x'
55    >>> Affichage.tex_coef(-5,'x',0,1)
56    '\\left( -5\\,x\\right)'
57    >>> Affichage.tex_coef(1,'x',0,1,1)
58    'x'
59    >>> Affichage.tex_coef(5,'x',0,1,1)
60    '\\left( 5\\,x\\right)'
61
62    :rtype: string
63    """
64    if coef != 0 and abs(coef) != 1:
65        if var == '':
66                a = TeX(coef)
67        else:
68                a = '%s\\,%s' % (TeX(coef), var)
69        if bplus and coef > 0:
70            a = '+' + a
71    elif coef == 1:
72        if var == '':
73            a = '1'
74        else:
75            a = '%s' % var
76        if bplus:
77            a = '+' + a
78    elif coef == 0:
79        a = ''
80    elif coef == -1:
81        if var == '':
82            a = '-1'
83        else:
84            a = '-%s' % var
85    if bpn and coef < 0 or bpc and coef != 0 and coef != 1 and var != '':
86        a = '\\left( ' + a + '\\right)'
87    return a
88
89def TeXz(nombre):
90    """n'affiche pas b si b=0
91
92    Double emploi avec tex_coef(nombre)"""
93    if nombre == 0:
94        return ""
95    else:
96        return TeX(nombre)
97def tTeX(nombre):
98    '''raccourci pour TeX(nombre,terme=True)'''
99    return TeX(nombre, terme=True)
100def pTeX(nombre):
101    '''raccourci pour TeX(nombre,parenthese=True)'''
102    return TeX(nombre, parenthese=True)
103def fTeX(nombre):
104    '''raccourci pour TeX(nombre,fractex="\\frac")'''
105    return TeX(nombre, fractex="\\frac")
106
107def TeX(nombre, parenthese=False, terme=False, fractex="\\dfrac"):
108    r"""**TeX**\ (*nombre*\ [, *parenthese*\ [, *terme*\ [, *fractex*\ ]]])
109
110    Permet l'affichage de nombres au format TeX. Fait en partie double emploi avec tex_coef. Permet
111
112    * d'écrire un nombre (décimal, rationnel ou radical) au format TeX
113    * d'écrire l'infini au format TeX
114    * d'ajouter un `+` devant `3` pour écrire `+3` avec `terme`
115    * de mettre des parenthèses autour de `3` avec `parenthese`
116    * de changer la commande d'écriture des fractions en TeX avec fractex
117
118    :param nombre: est le nombre à écrire
119    :type nombre: integer, Fractions, RacineDegre2
120    :param parenthese: si vrai, il faut écrire des parenthèses autour de `nombre`
121    :type parenthese: boolean
122    :param terme: Ajoute un `+` devant nombre s'il est positif.
123    :type terme: boolean
124    :param fractex: commande à utiliser pour créer une fraction sous TeX
125    :type fractex: string
126
127    >>> from pyromaths.outils import Affichage
128    >>> from pyromaths.classes.Fractions import Fraction
129    >>> Affichage.TeX(Fraction(7,3))
130    '\\dfrac{7}{3} '
131    >>> Affichage.TeX(Fraction(7,3),fractex='\\frac')
132    '\\frac{7}{3} '
133
134    :rtype: string
135    """
136    strTeX = finTeX = ""
137
138    # Affichage simplifié des racines ou fractions
139    if isinstance(nombre, Racine.RacineDegre2) and nombre.radicande == 0:
140        # Affiche la RacineDegre2 comme une Fractions
141        nombre = Fraction(nombre.numerateur, nombre.denominateur)
142    if isinstance(nombre, Fraction) and nombre.d == 1:
143        # Affiche la Fractions comme un entier
144        nombre = nombre.n
145    # parentheses des fractions
146    if parenthese and (
147        isinstance(nombre, Racine.RacineDegre2)
148                       and nombre.denominateur == 1 and (nombre.numerateur or nombre.coeff < 0)
149        # RacineDegre2 avec radicande nécessairement grâce au tri
150        or isinstance(nombre, Fraction) and nombre.n < 0
151        or isinstance(nombre, int) and nombre < 0
152        or isinstance(nombre, float) and nombre < 0):
153        strTeX = "\\left("
154        finTeX = "\\right)"
155    elif terme and (isinstance(nombre, Racine.RacineDegre2) and
156                        (nombre.d != 1 or (nombre.n > 0 or nombre.n == 0 and nombre.coeff >= 0))
157                    or nombre >= 0) :
158        strTeX = "+"
159        finTeX = ""
160
161    # #Affichage
162    if isinstance(nombre, (int, float)) and nombre == float("inf"):
163        return "+\\infty "
164    elif isinstance(nombre, (int, float)) and nombre == float("-inf"):
165        return "-\\infty "
166    elif isinstance(nombre, int) or isinstance(nombre, float):
167        return strTeX + decimaux(nombre) + finTeX
168    elif isinstance(nombre, Fraction):
169        if nombre.n < 0:
170            strTeX += "-" + fractex + "{" + decimaux(-nombre.n) + "}{" + decimaux(nombre.d) + "} "
171        else:
172            strTeX += fractex + "{" + decimaux(nombre.n) + "}{" + decimaux(nombre.d) + "} "
173        strTeX += finTeX
174        return strTeX
175    elif isinstance(nombre, Racine.RacineDegre2):
176        return strTeX + str(nombre) + finTeX
177    else:
178        return strTeX + str(nombre) + finTeX
179
180def radicalTeX(n):
181    return "\\sqrt{%s}" % (decimaux(n))
Note: See TracBrowser for help on using the repository browser.