source: pyromaths/trunk/fuentes/src/pyromaths/outils/TeXMiseEnForme.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.2 KB
Line 
1# -*- coding: utf-8 -*-
2#
3# Pyromaths
4# Un programme en Python qui permet de créer des fiches d'exercices types de
5# mathématiques niveau collège ainsi que leur corrigé en LaTeX.
6# Copyright (C) 2006 -- Jérôme Ortais (jerome.ortais@pyromaths.org)
7#
8# This program is free software; you can redistribute it and/or modify
9# it under the terms of the GNU General Public License as published by
10# the Free Software Foundation; either version 2 of the License, or
11# (at your option) any later version.
12#
13# This program is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16# GNU General Public License for more details.
17#
18# You should have received a copy of the GNU General Public License
19# along with this program; if not, write to the Free Software
20# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21#
22
23from . import Arithmetique
24import string
25import math
26import os
27from .Conversions import radians, degres
28from pyromaths.classes.Fractions import Fraction
29
30
31class TeXMiseEnForme:
32
33    def __init__(self, text):
34        self.text = text
35
36    def monome(self, coef, var, bplus=0, bpn=0, bpc=0):
37
38        # coef est le coefficient à écrire devant la variable var
39        # bplus est un booleen : s'il est vrai, il faut ecrire le signe +
40        # bpn est un booleen : s'il est vrai, il faut mettre des parentheses autour de l'ecriture si coef est negatif.
41        # bpc est un booleen : s'il est vrai, il faut mettre des parentheses autour de l'ecriture si coef =! 0 ou 1 et var est non vide
42
43        if coef != 0 and abs(coef) != 1:
44            if var == "":
45                if abs(coef) >= 1000:
46                    a = _('\\nombre{%s}') % coef
47                else:
48                    a = "%s" % coef
49            else:
50                if abs(coef) >= 1000:
51                    a = _('\\nombre{%s}\\,%s') % (coef, var)
52                else:
53                    a = '%s\\,%s' % (coef, var)
54            if bplus and coef > 0:
55                a = '+' + a
56        elif coef == 1:
57            if var == "":
58                a = '1'
59            else:
60                a = "%s" % var
61            if bplus:
62                a = '+' + a
63        elif coef == 0:
64            a = ""
65        elif coef == -1:
66            if var == "":
67                a = '-1'
68            else:
69                a = '-%s' % var
70        if bpn and coef < 0 or bpc and coef != 0 and coef != 1 and var != \
71            "":
72            a = '\\left( ' + a + '\\right)'
73        return a
74
75    def sepmilliers(self, nb, mathenvironment=0):
76
77        # Insère les espaces fines pour séparer les milliers et remplace le point
78        # décimal par une virgule
79
80        dec = [str(nb)[i] for i in range(len(str(nb)))]
81        if dec.count('e'):  # nb ecrit en notation scientifique
82            exposant = int(("").join(dec[dec.index('e') + 1:]))
83            dec = dec[:dec.index('e')]
84            lg = len(dec)
85            if dec.count('.'):
86                virg = dec.index('.')
87                dec.remove('.')
88            else:
89                virg = len(dec)
90            if virg + exposant < 0:  # L'ecriture decimale du nombre commence par 0,...
91                dec2 = ["0", '.']
92                for i in range(-virg - exposant):
93                    dec2.append("0")
94                dec2.extend(dec)
95                dec = dec2
96            elif virg + exposant > lg:
97
98                # L'ecriture decimale du nombre finit par des 0
99
100                for i in range(-((lg - virg) - 1) + exposant):
101                    dec.append("0")
102        dec2 = []
103        if dec.count('.'):
104            lavtvirg = dec.index('.')
105            laprvirg = (len(dec) - dec.index('.')) - 1
106        else:
107            lavtvirg = len(dec)
108            laprvirg = 0
109        nbsep = lavtvirg // 3 + 1
110        if lavtvirg > 3:
111            cpt = lavtvirg % 3
112            if cpt:
113                dec2 = dec[0:cpt]
114                dec2.append('\\,')
115                nbsep = nbsep - 1
116            for i in range(nbsep):
117                dec2.extend(dec[cpt:cpt + 3])
118                if nbsep - i > 1:
119                    dec2.append('\\,')
120                cpt = cpt + 3
121        else:
122            if dec.count('.'):
123                dec2 = dec[0:dec.index('.')]
124            else:
125                dec2 = dec
126        if dec.count('.'):
127            cpt = dec.index('.')
128        else:
129            cpt = len(dec)
130        if laprvirg <= 3:
131            dec2.extend(dec[cpt:])
132        else:
133            nbsep = laprvirg // 3 - 1
134            dec2.extend(dec[cpt:cpt + 4])
135            dec2.append('\\,')
136            cpt = cpt + 4
137            for i in range(nbsep):
138                dec2.extend(dec[cpt:cpt + 3])
139                if cpt + 3 < len(dec):
140                    dec2.append('\\,')
141                cpt = cpt + 3
142            dec2.extend(dec[cpt:])
143        nb = ("").join(dec2)
144        if nb.endswith('.0'):
145            nb = string.rsplit(nb, '.0')[0]
146        if mathenvironment:
147            return string.join(string.rsplit(nb, sep='.'), '{,}')
148        else:
149            return string.join(string.rsplit(nb, sep='.'), ',')
150
151sepmilliers = TeXMiseEnForme("").sepmilliers
152
153def Affichage(l):
154    """\xc3\x89crit une expressions contenant des d\xc3\xa9cimaux et des fractions au format TeX
155
156    @param l: liste contenant l'expression [3, '+', 5, '*', 2]
157    """
158
159    expr = ""  # résultat
160    for i in range(len(l)):  # on parcourt la liste
161        if ["+", "-", "*", "/", '(', ')'].count(l[i]):  # Un opérateur
162            if l[i] == "*":
163                expr = expr + " \\times "
164            elif l[i] == "/":
165                expr = expr + " \\div "
166            elif l[i] == ")" and type(l[i - 1]) == type(Fractions(1, 1)):
167                expr = expr + " \\big) "
168            elif i < len(l) - 2 and l[i] == "(":
169                if type(l[i + 1]) == type(Fractions(1, 1)):
170                    expr = expr + " \\big( "
171            else:
172                expr = expr + " " + l[i] + " "
173        elif type(l[i]) == type(Fractions(1, 1)):
174            # C'est une fraction
175            expr = expr + "%s" % Fractions.TeX(l[i], signe=0)
176        else:
177            # C'est un nombre
178            expr = expr + "%s" % Affichage.decimaux(l[i], 1)
179    return expr
Note: See TracBrowser for help on using the repository browser.