Écrire des mathématiques en html & css
Intro
La rédaction de textes mathématiques est relativement complexe en raison de l'usage de nombreux symboles latins, grecs, et non-alphabétiques. Ces symboles ont en général une correspondance simple, voir plus bas pour l'aphabet grec et bien d'autres caractères.Ensuite, et surtout, le positionnement des symboles est problématique, notamment dans les fractions, matrices, puissances et indices.
Le système de composition Latex permet de créer des documents scientifiques d'une trsè grande qualité. Le rendu graphique y est en fait optimisé pour l'impression (Latex génère initialement un fichier " ps " ou fichier postscript, qui est un fichier de points destiné à un système d'impression). La qualité des documents créés est aussi excellente dans des fichiers de type pdf, très couramment utilisés et dont un lecteur est en général même intégré dans tout navigateur web.
L'affichage dans un navigateur est plus complexe, notamment à l'heure où il existe une grande variété de tels navigateurs, une grande variété de taille d'écrans, … Néanmoins, on ne souhaite pas forcément imprimer systématiquement tout document, et il est donc nécessaire de pouvoir consulter un texte directement en ligne sur son navigateur.
Plusieurs solutions existent:
- remplacer les formules mathématiques (ou tout autre graphique, schéma, …) par des images. Ce site utilise à outrance cette méthode même si l'alignement des formules n'est pas toujours ainsi optimal.
- utiliser une bibliothèque javascript comme MathJax comme la bibliothèque est quelque peu lourde à charger, surtout pour, finalement, parfois pour n'afficher que quelques symboles et fractions. Le code convertit, en javascript, les instructions Latex écrites dans la page html, ce qui peut aussi être nettement ralentir le chargement de la page avec un ordinateur modeste.
- utiliser MathML, qui est un ensemble de balises et règles syntaxiques. Malheureusmeent, tous les navigateurs ne le supportent pas nativement, et je trouve celui-ci relativement lourd même pour écrire des choses simples.
- manipuler directement les css, qui est le langage permettant la mise en page du html, et c'est l'objectif de ce qui suit …
Environnement math
On définit un environnementmath
propre à l'écriture de mathématiques, comme le $ en Latex.
Dans cet environnement, les variables s'écrivent simplement en italique, et on peut différencier un mode "inline" du mode "display".
.math {font-family:times;padding:0 .1em;font-size:1.2em;font-style:normal;}
.ct{text-align:center}
Par exemple,
<span class="math">3<i>x</i><sup>2</sup>+2<i>y</i>=27</span>
donne l'équation inline
3x2+2y=27
tandis que
<div class="math ct"><i>f</i>(<i>x</i>) = 3<i>x</i> − 2</div>
défini cette fois une formule en mode display, c'est-à-dire à la ligne et centrée:
f(x) = 3x − 2
Césure des expressions et équations mathématiques
Selon la taille d'une expression mathématique et de de celle de l'écran (surtout avec leur très grande diversité: écran d'ordinateur de bureau, de portable, de smartphone, de tablette, ...), les champs mathématiques peuvent parfois se retrouver coupés (tout comme les mots d'ailleurs).Parfois, il est bon de spécifier que tel groupe, ou telle partie d'une expression, ne doit pas être coupé. En orthographe, cela s'appelle des règles de césure, et sont définies pour chaque langue.
En mathématiques, par contre …
Par défaut, une expression sera coupée où cela est nécessaire par rapport à la taille de texte disponible. On peut indiquer qu'un groupe doit rester intègre avec la règle
white-space:nowrap
, par exemple avec la classe css
.dspbl{white-space:nowrap}
et alors on peut imposer par exemple dans une équation:
e2x+1(x2 + 2) =
3x + 2
⇔
e2x+1(x2 + 2) = 3x + 2
avec
⇔
e2x+1(x2 + 2) = 3x + 2
<div style="width:10em;border:1px solid blue">
<span class="math">e<sup>2<i>x</i>+1</sup>(<i>x</i><sup>2</sup> + 2) =
3<i>x</i> + 2 </span>
<br>
<span class="math">⇔</span><br>
<span class="math">e<sup>2<i>x</i>+1</sup>(<i>x</i><sup>2</sup> + 2)
<span class="dspbl"> = 3<i>x</i> + 2</span></span>
</div>
Fractions
La difficulté avec les frations, c'est l'alignement… d'autant plus que celui-ci est déterminant aussi pour le calcul en lui-même, la division n'étant pas associative: 6 3 2 = 6 × 23 = 4 tandis que 6 3 2 = 6 3 × 1 2 = 1 ce qui montre bien que 6 3 2 ≠ 6 3 2Pour afficher correctement une fraction (ou une fraction dans une fraction … ), on peut définir en css un bloc
frac
,
dans lequel seront nécessairement définis 3 blocs: num
pour le numérateur, den
pour le dénominateur, et enfin
la barre de fraction fracbar
dont la bordure inférieure (border-bottom
) dessinera effectivement le trait de fraction de la bonne largeur:
.frac{
display:inline-block;
margin-left:.1em;margin-right:.1em;
vertical-align:-64%;
text-align:center;
}
.frac > .num, .frac > .den{
display:inline-block;
padding:0 .1em;
}
.frac > .fracbar {display:block;
height:0;margin:0;border:0;
border-bottom:.1em solid;
overflow:hidden;
}
.den{vertical-align:top;}
Avec ceci, par exemple,
<span class="math">
<span class="frac">
<span class="num">1</span>
<span class="fracbar">/</span>
<span class="den">2</span>
</span>
donne
12
et on peut, en imbriquant les fractions, écrire le développement en fraction continue du nombre d'or: φ = 1+ 1 1+ 1 1+ 1 1+ 1 …
À savoir que html permet aussi directement l'écriture de quelques fractions simples:
html | affichage |
| ½ |
| ½ |
| ⅓ |
| ⅔ |
| ¼ |
| ¾ |
html | affichage |
| ⅛ |
| ⅜ |
| ⅝ |
| ⅞ |
Racines carrées
La difficulté pour les racines carrées réside dans la représentation du radical, c'est-à-dire le symbole de la racine carrée, et qui plus est à la bonne taille.Je propose ici deux méthodes pour ce faire.
En utilisant le symbole html √
En html, le symbole existe, il s'agit de√
qui affiche √ .
Il n'est pas possible, à ma connaissance, d'adapter directement la taille du symbole, c'est-à-dire de la fonte, en fonction de la taille du bloc qui suit. On peut imaginer le faire en javascript.
On peut proposer simplement plusieurs tailles de radicaux, qui devraient permettre de répondre simplement à la grande majorité des cas.
Modifier la taille via
font-size
n'est pas une bonne idée car l'épaisseur du trait va varier en conséquence et le résultat ne sera pas très esthétique.
On peut utiliser plut&ocicr;t la propriété scale
de la fonction transform
.
Plus précisément, comme on ne souhaite qu'agrandir en hauteur ce symbole, on utilisera scaleY
.
.sq, .sq2, .sq3, .sq4{display:inline-block;
border-top:1px solid black;
position:relative;
margin-left:.3em;
}
.sq:before{content: "\00221A";
position:absolute;
top:-.05em;
display:inline-block;
left:-.48em;}
.sq2:before{content: "\00221A";
display:inline-block;
position:absolute;
top:-.05em;
transform-origin:top right;
transform: scaleY(2);
left:-.5em;
}
.sq3:before{content: "\00221A";
display:inline-block;
position:absolute;
left:-.48em;top:-.08em;
transform-origin:top right;
transform: scaleY(3);
}
.sq4:before{content: "\00221A";
display:inline-block;
position:absolute;
left:-.48em;top:-.1em;
transform-origin:top right;
transform: scaleY(4);
}
ce qui permet d'obtenir,
avec le style sq:
a =
32
puis sq2:
b =
3212
et
c2 =
32
2312
et
d2 =
1113
2327
et sq3:
c3 =
32
2312
et
d3 =
1113
2327
et enfin sq4:
d4 =
1113
2327
.
Il faut ainsi choisir au moment de la rédaction la taille du radical souhaité …
En dessinant, en css, le radical
Je propose ici de dessiner directement ce symbole en représentant un cadre avant la racine (pseudo-élémentbefore
) incliné et tourné (propriétés skew
et rotate
de la fonction transform).
.cadre{
position:relative;
display:inline-block;
border-top:2px solid green;
margin-left:.7em;
padding-left:.2em;
padding-right:.1em
}
.cadre:before{content: " ";
position: absolute;
display: inline-block;left:-.65em;
height:56%;
width:.6em;
border:1px solid black;
border-right:2px solid red;
border-bottom:2.5px solid blue;
transform-origin: top right;
transform: rotate(55deg) skew(50deg);
}
ce qui permet d'obtenir a =2
Pour obtenir le radical, symbole de la racine carrée, on ne représente finalement que les bordures droites et inférieures du cadre "before", placé avant le radicande:
.sqrt{
position:relative;
display:inline-block;
border-top:2px solid black;
margin-left:.7em;
padding-left:.2em;
padding-right:.1em
}
.sqrt:before{content: " ";
position: absolute;
display: inline-block;left:-.65em;
height:56%;
width:.6em;
border-right:2px solid black;
border-bottom:2.5px solid black;
transform-origin: top right;
transform: rotate(55deg) skew(50deg);
}
ce qui permet d'obtenir
a =2
avec simplement
<span class="math">a=<span class="sqrt">2</span></span>
ou encore, avec une fraction et un un radical de taille adaptée b = 1234 avec simplement
<span class="math">b =
<span class="sqrt">
<span class="frac">
<span class="num">12</span>
<span class="fracbar"></span>
<span class="den">34</span>
</span>
</span>
</span>
Les racines d'un trinôme du second degré s'écrivent: -b ± b2 − 4ac 2a et une racine d'un quotient de fractions: ab = 1234 1335 = 1234 × 1335
Enfin, pour les amoureux du nombre d'or φ, des fractions continues, et des racines carrées, on a les relations:
φ=
1+
1
1+
1
1+
1
1+
1
…
=
1+φ
=
2+
1
1+
1
1+
1
1+
1
…
Matrices
Pour écrire des matrices, dans un environnement " matrix " avec des bordures à droite et gauche légèrement arrondies (border-radius
) pour simuler des parenthèse (ou des bords droits pour un déterminant),
on définit des lignes (row
) qui contiennent des coefficients.
.matrix {display:inline-block;
border-left:1px solid;
border-right:1px solid;
border-radius:.6em;
vertical-align:middle;
}
.matrix > .row {display:table-row}
.matrix > .row > .aij {display:table-cell;text-align:center;padding: 0.1em 0.3em;}
Avec ceci, on obtient A = 12 34 avec
<span class="math"><i>A = </i>
<span class='matrix'>
<span class='row'>
<span class="aij">1</span>
<span class="aij">2</span>
</span>
<span class='row'>
<span class="aij">3</span>
<span class="aij">4</span>
</span>
</span>
</span>
On peut définir bien d'autres matrices alors, comme M = 123 234 ︙︙︙ 352353354 sachant que les points de suspensions … ︙ ⋱ s'obtiennent respectivement avec
… ︙ ⋱
Tableau de variations
On peut tracer un tableau de variations à l'aide d'un ... tableau: l'environnmenenttable
, et quelques aménagements css
table.math {border:1px solid black;border-collapse:collapse}
table.math {border:1px solid black;border-collapse:collapse;text-align:center}
table.math td{padding:0;width:1em}
table.math tr{height:.8em}
table.math tr:first-child{border:1px solid black;}
table.math td:first-child {width:2em;border-right:1px solid black}
table.math .bigfl{font-size:1.5em}
/* pour barres verticales simples et doubles /*
table.math .sb{width:0;border-left:1px solid black}
table.math .db{width:3px;border-left:2px solid black;border-right:2px solid black;position:relative}
et le html, avec des fèches obliques, en code html, ↗ pour ↗ et ↘ pour ↘
<table class="math">
<tr>
<td><i>x</i></td>
<td>−∞</td>
<td></td>
<td>3</td>
<td></td>
<td>+∞</td>
</tr>
<tr>
<td></td> <td></td> <td></td> <td>2</td> <td></td> <td></td>
</tr>
<tr>
<td><i>f</i></td>
<td></td>
<td class="bigfl">↗</td>
<td></td>
<td class="bigfl">↘</td>
<td></td>
</tr>
<tr>
<td></td>
<td>−∞</td> <td></td> <td></td> <td></td> <td>1</td>
</tr>
</table>
pour obtenir
x | −∞ | 3 | +∞ | ||
2 | |||||
f | ↗ | ↘ | |||
−∞ | 1 |
et le même tableau, avec une valeur interdite
x | −∞ | 3 | +∞ | ||||
f | ↘ | ↘ | |||||
grâce au html suivant:
<table class="math">
<tr>
<td><i>x</i></td>
<td>−∞</td> <td></td>
<td colspan="3">3</td> <td></td>
<td>+∞</td>
</tr>
<tr>
<td></td> <td></td> <td></td> <td></td><td class="db"></td><td></td> <td></td> <td></td>
</tr>
<tr>
<td><i>f</i></td>
<td></td>
<td class="bigfl">↘</td> <td></td><td class="db"></td><td></td>
<td class="bigfl">↘</td> <td></td>
</tr>
<tr>
<td></td> <td></td> <td></td> <td></td><td class="db"></td><td></td> <td></td> <td></td>
</tr>
</table>
Tableau de signes
De même, avec le csstable.signe tr{border:1px solid}
table.signe td{padding:0 .3em 0 .3em}
table.signe td.db{padding:0}
et le html:
<table class="math signe">
<tr>
<td><i>x</i></td>
<td>−∞</td> <td></td> <td>−2</td> <td></td> <td>−1</td> <td></td> <td>+∞</td>
</tr>
<tr>
<td><i>x</i> + 2</td>
<td></td> <td> − </td> <td>0</td> <td> + </td> <td>|</td> <td> + </td> <td></td>
</tr>
<tr>
<td>−<i>x</i> − 1</td>
<td></td> <td> + </td> <td>|</td> <td> + </td> <td>0</td> <td> − </td> <td></td>
</tr>
<tr>
<td><span class="dspbl">(<i>x</i> + 2) (−<i>x</i> − 1)</span></td>
<td></td> <td> − </td> <td>0</td> <td> + </td> <td>0</td> <td> − </td> <td></td>
</tr>
</table>
on obtient:
x | −∞ | −2 | −1 | +∞ | |||
x + 2 | − | 0 | + | | | + | ||
−x − 1 | + | | | + | 0 | − | ||
(x + 2)(−x − 1) | − | 0 | + | 0 | − |
Équations sur plusieurs lignes
Comme en Latex, on peut proposer un mode "inline", ici la classealign
et un mode "display", ici la classe calign
.
Les éléments dans chaque cellule sont centrés par défaut, et on peut, comme en Latex, les aligner à gauche ou à droite.
Le css est le suivant:
.align {display:inline-table;vertical-align:middle}
.calign {display:table;margin:0 auto}
.calign .row, .align .row {display:table-row}
.calign .row .cell, .align .row .cell {display:table-cell;text-align:center;padding-left:.1em;padding-right:.1em}
.calign .row .l, .align .row .l{display:table-cell;text-align:left}
.calign .row .r, .align .row .r{display:table-cell;text-align:right}
Pour que par exemple,
<div class="math calign">
<span class="row">
<span class="cell"><i>f</i>(<i>x</i>)</span>
<span class="cell">=</span>
<span class="cell r">(<i>x</i>+2)<sup>2</sup> − 4</span>
</span>
<span class="row">
<span class="cell"></span>
<span class="cell">=</span>
<span class="cell l"><i>x</i><sup>2</sup>+2<i>x</i></span>
</span>
</div>
afiche en mode display:
f(x)
=
(x+2)2 − 4
=
x2 + 4x
ou encore en mode inline:
f(x)
=
(x+2)2 − 4
=
x2 + 4x
=
x2 + 4x
avec
<span class="math top">
<span class="align">
<span class="row">
<span class="cell"><i>f</i>(<i>x</i>)</span>
<span class="cell">=</span>
<span class="cell r">(<i>x</i>+2)<sup>2</sup> − 4</span>
</span>
<span class="row">
<span class="cell"></span>
<span class="cell">=</span>
<span class="cell l"><i>x</i><sup>2</sup> + 4<i>x</i></span>
</span>
<span class="row">
<span class="cell"></span>
<span class="cell">=</span>
<span class="cell l"><i>x</i><sup>2</sup> + 4<i>x</i></span>
</span>
</span>
</span>
Accolade sur plusieurs lignes ! - Systèmes et ensembles
On peut écrire un système simplement avec le mode précédent: plusieurs équations sur plusieurs lignes et alignées:
2x
+
y
=
125
−x
+
5y
=
−2
Il reste à dessiner l'accolade …
Une bordure gauche est un premier pas. On créé un environnement, ou classe,
syst
.syst {position:relative;
display:inline-block;
border-left:2px solid;
border-radius:.3em;
padding-left:0em;
margin-left:.25em}
qui donne
2x
+
y
=
125
−x
+
5y
=
−2
On va ensuite ajouter le symbole mathématique < ( ou plus finement: ≺ , qui est en mathématique le prédécesseur dans une suite, unicode ≺ ≺, mais ne semble pas connu par défaut par tous les navigateurs...) et le pseudo-élément
before
.syst::before {content:"≺";
font-size:.6em;font-weight:bold;
display:inline-block;
width:1em;margin-left:-1em;
text-align:right;vertical-align:middle
}
On donne une largeur fixe à cet élément before, 1em, ce qui permet en le déplaçant d'autant, de l'aligner exactement avec la bordure:
2x
+
y
=
125
−x
+
5y
=
−2
On y est presque ! …
Pour peaufiner le tout, il reste à rendre le fond, derrière le symbole ≺, blanc et opaque.
On ne peut pas utiliser directement la propriété
background-color
, car celui-ci est plus large que le symbole,
et donc "effacerait" un peu trop de la bordure:
2x
+
y
=
125
−x
+
5y
=
−2
On peut utiliser une image de fond. Pour faire le plus léger, un carré blanc de 1px de côté, dimensionné et positionné correctement.
Enfin, pour insérer cette image en background dans le pseudo-élément before, on peut l'insérer directement en base64 (converti en base64, par exemple grâ au convertisseur de w3docs ), afin de ne pas avoir à charger une image supplémentaire.
.syst {
position:relative;display:inline-block;
border-left:2px solid;border-radius:.3em;
padding-left:0em;margin-left:.25em}
.syst::before {content:"≺";
font-size:.6em;font-weight:bold;
display:inline-block;width:1em;margin-left:-1em;
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAA3NCSVQICAjb4U/gAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAADElEQVQImWP4//8/AAX+Av5Y8msOAAAAAElFTkSuQmCC");
background-repeat: no-repeat;background-size:.4em;background-position: 100% 60%;
text-align:right;vertical-align:middle
}
Finalement, avec cette dernière version, le html
<span class="math">
<span class="syst">
<span class="align">
<span class="row">
<span class="cell r">2<i>x</i></span>
<span class="cell">+</span>
<span class="cell r"><i>y</i></span>
<span class="cell">=</span>
<span class="cell r">125</span>
</span>
<span class="row">
<span class="cell r">−<i>x</i></span>
<span class="cell">+</span>
<span class="cell r">5<i>y</i></span>
<span class="cell">=</span>
<span class="cell r">−2</span>
</span>
</span>
</span>
</span>
permet d'obtenir le système, en mode inline:
2x
+
y
=
125
−x
+
5y
=
−2
ou avec plus d'équations
2x
+
y
+
3z
=
125
−x
+
5y
=
−2
−x
+
2y
+
17z
=
−217
2y
−
5z
=
6
Enfin, on peut faire la même chose à droite pour obtenir une accolade fermante, et ainsi noter un ensemble, par exemple, l'ensemble des nombres rationnels Q = p q ; p ∈ Z , q ∈ Z*
Parenthèses
La difficulté des parenthèses, et autres délimiteurs, et l'adaptation à la taille de ce qu'elles délimitent.On peut dessiner des parenthèses en utilisant des bordures, gauches et droites, qui s'adapteront donc automatiquement à la taille du contenu:
.lrp{display:inline-block;
border-left:.15em solid;border-right:2px solid;
border-radius:.7em;
padding:.3em;padding-top:0;padding-bottom:0;
margin:.1em
}
puis avec
<span class="math">
<i>x</i>
<span class="lrp"> 2 + <i>x</i></span>
</span>
on obtient
x 2 + x
et avec
<span class="math">
A(<i>x</i>)=
<span class="lrp">
<span class="frac">
<span class="num">1</span><span class="fracbar">/</span><span class="den">2</span>
</span>
<span class="lrp">2 + <i>x</i></span>
+ <i>x</i>
</span>
×
<span class="lrp">
1+
<span class="frac">
<span class="num">1</span><span class="fracbar">/</span><span class="den">2+x</span>
</span>
</span>
</span>
on obtient
A(x)=
12
2 + x
+ x
×
1+
12+x
Crochets, intervalles fermés, ouverts et semi-ouverts
On peut dessiner des crochets en tirant parti des pesudo-élémentsbefore
et after
:
avant et après, donc, on ajoute un élément vide (content=""
) de la même hauteur que le bloc lui-même (height:100%
), très peu large, et enfin avec une bordure sauf d'un côté, pour créer des intervalles (ou autres) fermés, ouverts/fermés, fermés/ouverts et ouverts/ouverts:
.lrb, .lrboo, .lrbof, .lrbfo{display:inline-block;position:relative;margin:.3em;padding:.2em;padding-bottom:0}
.lrb:before, .lrbof:before, .lrbfo:before, .lrboo:before{content:"";display:inline-block;position:absolute;top:-2px;left:0;width:.15em;height:100%;border:1.5px solid;margin-left:-.2em}
.lrb:after, .lrbof:after, .lrbfo:after, .lrboo:after{content:"";position:absolute;border:1.5px solid;height:100%;width:.15em;top:-2px;right:0;margin-right:-.2em}
.lrb:before{border-right:0}.lrb:after{border-left:0}
.lrbof:before{border-left:0}.lrbof:after{border-left:0}
.lrbfo:before{border-right:0}.lrbfo:after{border-right:0}
.lrboo:before{border-left:0}.lrboo:after{border-right:0}
pour pouvoir écrire par exemple la formule
3×(x+1)2−12
=
3x2
+6x
+32
ou encore les intervalles x∈ 3 ; 25 ou x∈ 3 ; 25 ou x∈ 3 ; 25 ou x∈ 3 ; 25
Puissances
Toujours de la même façon, le problème est l'alignement en hauteur automatique.La balise
sup
permet de surélever du texte par rapport simplement à la ligne de base.
Si on veut le surélever par rapport à la hauteur du block précédent, il faut justement utiliser cette balise dans le block en question:
.pw sup{display: inline-block;
position: relative;
vertical-align: top;
top:-.3em;margin-left:-.3em}
puis, par exemple
<span class="math">
<span class="pw">
<span class="lrp">
<span class="frac">
<span class="num">1</span><span class="fracbar">/</span><span class="den">2</span>
</span>
+ <i>x</i>
</span>
<sup>2</sup>
</span>
</span>
pour obtenir 12 + x 2
Vecteurs
Trois méthodes; j'utilise la troisième.Les deux premières utilisent des caractères spéciaux: → et >. Il se trouve que chaque navigateur utilise un moteur de rendu des caractères différents et donc, même avec une même police, les caractères peuvent avoir quelques différences, ce qui nuit à la mise en page. Par exemple la flèche → donne avec Firefox et Chrome tandis qu'en mode math (donc en times) Firefox: et Chrome: .
L'utilisation de ces caractères n'est donc idéale universellement; je les donne quand même car je les ai utilisés avant de comprendre la raison des distortion observées et que cela peut peut-être intéresser.
Flèche adaptée automatiquement
La notation d'un vecteur se fait avec une flèche au dessus de texte, par exemple, u ou AB . Une bordure sur le texte trace le trait de la flèche, et on peut placer la pointe de cette flèche enafter
.
Le comportement entre certains navigateur, notamment Chrome, peut différer car ce dernier (jusqu'à quelle version ?) arrondit ces calculs et omet les parties décimales de pixels; voir par exemple cette discussion. Ce comportement est d'autant plus visible en grossissant le texte directement dans le navigateur en visionnant la page, et où on voit bien que des alignements peuvent alors évoluer …
.vect{display:inline-block;
position:relative;
font-size:1em;
border-top:.11em solid
}
.vect:before{content:">";
font-family:arial;font-size:.8em;
display:inline-block;margin-right:-.2em;
position:absolute;right:0;
width:.6em;top:-.65em
}
Le vecteur AB s'obtient alors avec
<span class="math">
<span class="vect">AB
</span>
</span>
ou
u
avec
<span class="math">
<span class="vect">
<i>u</i>
</span>
</span>
ou encore
v3
avec
<span class="math">
<span class="vect">
<i>v</i><sub>3</sub>
</span>
</span>
On peut alors combiner vecteurs et coordonnées, en utilisant la mise en page pour les matrices, par exemple: AB 1 2 3 ou écrire de longs vecteurs: ABCDEF
Avec le caractère &rarr: →
Seulement pour des vecteurs avec un caractère ou deux:.vec, .vec2{display:inline-block;position:relative}
.vec{bottom:.4em;left:.6em;margin-left:-.7em}
.vec2{bottom:.6em;left:1em;margin-left:-.8em;transform:scale(2,1.2)}
puis en html
<span class="math"><span class="vec">→</span><i>u</i></span>
et
<span class="math"><span class="vec2">→</span>AB</span>
pour obtenir
→u et →AB
ou encore →u1
ou le carré scalaire
→u 2
En dessinant complètement la flèche en css
On peut enfin dessiner une flèche complètement en css, comme on l'a fait pour la racine carrée. C'est aussi la méthode la plus robuste "multi-navigateurs" pour écrire des vecteurs par exemple..math .to{display:inline-block;position:relative;
width:.6em;height:0;bottom:.2em;
border:1px solid;
margin-left:.15em;margin-right:.15em;
background-color:black;}
.math .to:after{content:"";
display:inline-block;position:absolute;
right:0;
border:1px solid;
width:.3em;height:.3em;top:-.05em;
transform-origin:right center;transform:rotate(45deg);
border-left:0;border-bottom:0;}
ce qui permet d'obtenir
ou enore x+∞
avec
<span class="math"><span class="to"></span></span>
ou enore
<span class="math">
<i>x</i>
<span class="to">
</span>+∞
</span>
Pour écrire un vecteur, il ne reste plus qu'à positionner cette flèche au-dessus des caractères concernés.
.math .vect{position:relative;display:inline-block;
margin-top:.1em;}
.math .vect:before{content:"";
display:inline-block;position:absolute;
border:.5px solid;
box-sizing:border-box;
width:100%;height:0;
background-color:black;
right:0;top:-.1em;
}
.math .vect:after{content:"";
display:inline-block;position:absolute;
border:1px solid;border-left:0;border-bottom:0;
width:.25em;
height:.25em;right:.05em;top:-.1em;
box-sizing:content-box;
transform-origin:right center;transform: rotate(45deg);
}
ce qui donne
les vecteurs u ,
ou AB.
Enfin, on peut prévoir une flèche pour des vecteurs écrits avec une seule lettre, très courant en mathématiques, avec une flèche un peu plus petite et plus basse:
.math .vects{position:relative;display:inline-block;
margin-top:.0}
.math .vects:before{content:"";
display:inline-block;position:absolute;
border:.5px solid;
box-sizing:border-box;
width:100%;height:0;
background-color:black;
right:0;top:.1em;
}
.math .vects:after{content:"";
display:inline-block;position:absolute;
border:1px solid;border-left:0;border-bottom:0;
width:.2em;height:.2em;right:.05em;top:.1em;
box-sizing:content-box;transform-origin:right center;transform: rotate(45deg);
}
pour obtenir cette fois
u plutôt que
u.
Avec tout ça on peut finalement écrire par exemple, la relation de Chasles:
Soit u = AC et v = CB alors on a
AB = u + v
Produit scalaire
Le produit scalaire de deux vecteurs, \cdot avec Latex, se note avec un point:.cdot{vertical-align:.1em;font-weight:bold}
puis
<div class="math ct">
<span class="vects"><i>u</i></span>
<span class="cdot">.</span>
<span class="vects"><i>v</i></span>
=
<i>xx</i>' + <i>yy</i>'
</div>
u
.
v
=
xx' + yy'
Sommes
On crée une "pile" (stack) avec des éléments de typebloc
qui vont ainsi s'empiler les uns au dessous des autres, dans l'ordre de leur déclaration.
.math .stack{display:inline-block;
vertical-align:middle;
line-height:.95}
.math .stack .sign{display:block;font-size:2em}
.math .stack sub{display:block;text-align:center}
.math .stack sup{display:block;text-align:center}
Par exemple, la somme géométrique S = n ∑ k=0 qk = 1 − qn+1 1 − q s'obtient avec
<span class="math">
<i>S</i> =
<span class="stack">
<sup><i>n</i></sup>
<span class="sign">∑</span>
<sub><i>k</i>=0</sub>
</span>
<i>q</i><sup><i>k</i></sup>
=
<span class="frac">
<span class="num">1 − <i>q</i><sup><i>n</i>+1</sup>
</span><span class="fracbar">/</span>
<span class="den">1 − <i>q</i></span>
</span>
</span>
et la série de Riemann:
ζ(2) =
∑
k∈N*
1k2
=
π2
6
Limites
pour a def= 3 et
limn+∞ un =
1
π2
et
x→−∞lim
f (x) = l
et
aalim
et
aalim
et
aAlim
et
AAlim
AAA →a et →a→
un
x+∞
aa
lim∼
1
n2
Intégrales
La difficulté réside dans l'écriture du signe intégral, grâce à ∫: ∫, un peu sytlisé et l'écriture des bornes.On peut déclarer une boîte contenant ces trois éléments, dans laquelle les bornes seront en
position:absolute
et positionnées en haut et bas.
Pour sytliser le sybole intégrale, on peut l'écriture en plus grand, et le compresser horizontalement (
scaleX
avec un coefficient inférieur à 1) et l'incliner (skew
).
Des différences restent entre les navigateurs, semblant venir du fait que le symbole intégrale ∫ n'a pas les mêmes dimensions pour chacun, même avec la même police et la même taille explicitement données …
.int{display:inline-block; vertical-align:-40%;position:relative;text-align:left;}
.int .sg{display:inline-block;font-size:260%;line-height:1.4;margin-top:-.2em;
transform: scaleX(.7) skew(-12deg);
-ms-transform: scaleX(.7) skew(-10deg); /* IE 9 */
-webkit-transform: scaleX(.8) skew(-14deg); /* Safari and Chrome */
-o-transform: scaleX(.7) skew(-10deg); /* Opera */
-moz-transform: scaleX(.6) skew(-10deg); /* Firefox */
}
.int sub{font-size:.7em;position:absolute;bottom:0;left:.7em}
.int sup{font-size:.7em;position:absolute;top:0;left:1.65em}
ce qui donne
∫
b
a
f (x) dx
Enfin, en reprenant les crochets, et en y ajoutant de même que préccédemment les bornes (en
position:absolute
):
.lrbornes{display:inline-block;position:relative}
.lrbornes .binf{font-size:0.8em;display:inline-block;
margin-top:1em;vertical-align:bottom;
height:1em;line-height:1.5em;
}
.lrbornes .bsup{font-size:0.8em;position:absolute;
display:block;top:-.2em;right:0
}
on peut finalement écrire une formule complète d'intégration: ∫ −∞ +∞ f (x) dx = F(x) −∞+∞
Coefficients binomiaux
et
<span class="math"><i>a </i> =
<span class="lrp"><span class="align">
<span class="row"><span class="cell">1</span></span>
<span class="row"><span class="cell">2</span></span>
</span></span>
</span>
pour obtenir a =
1
2
soit
n
k
=
n!
k! (n-k)!
Alphabet grec et quelques autres caractères
L'utilisation de l'alhabet grec est incontournable en maths !html | Latex | affichage |
|
| α |
|
| β |
|
| γ |
|
| δ |
|
| ε |
|
| ζ |
|
| η |
|
| θ |
|
| ι |
|
| κ |
|
| λ |
|
| μ |
|
| ν |
|
| ξ |
|
| ο |
|
| π |
|
| ρ |
|
| σ |
|
| τ |
|
| υ |
|
| φ |
|
| χ |
|
| ψ |
|
| ω |
html | Latex | affichage |
|
| Α |
|
| Β |
|
| Γ |
|
| Δ |
|
| Ε |
|
| Ζ |
|
| Η |
|
| Θ |
|
| Ι |
|
| Κ |
|
| Λ |
|
| Μ |
|
| Ν |
|
| Ξ |
|
| Ο |
|
| Π |
|
| Ρ |
|
| Σ |
|
| Τ |
|
| Υ |
|
| Φ |
|
| Χ |
|
| Ψ |
|
| Ω |
Autres caractères mathématiques
Lettres "rondes"
Les lettres "rondes", assez utilisées en maths peuvent s'écrire en html avec le suffixe "scr", par exemple en majuscule&s;Pscr;
donne 𝒫 et 𝒫 en mode maths
et en minuscule 𝓅
donne 𝓅.
La loi de probabilité géométrique s'écrit alors
<span class="math">𝒢(<i>n</i></span>
pour obtenir
𝒢(n) ou encore, pour la loi binomiale,
<span class="math">ℬ(<i>n</i><,<i>p<i>)/span>
pour obtenir
ℬ(n,p)
Flèches
Quelques flèches: simples composées avec le suffixe "arr" et doubles avec le suffixe "Arr" (pour arrow, flèche), et un préfixe indiquant la direction: l (left), r (right), lr (left-right), u (up), d (down), h (horizontal) ou v (vertical), et éventuellement un pré-préfixe x (grande taille)html | Latex | affichage |
|
| → |
|
| ⟶ |
|
| ⇒ |
|
| ⟹ |
|
| ← |
|
| ⟵ |
|
| ⇐ |
|
| ⟸ |
|
| ⇆ ⇄ |
|
| ↔ |
|
| ⟷ |
|
| ↕ |
|
| ⇕ |
|
| ↦ |
|
| ⟼ |
|
| ⇔ ⇔ |
|
| ⟺ |
|
| ↵ |
Opérateurs
html | Latex | affichage |
|
| = |
|
| ≡ |
|
| ≠ |
|
| ∼ |
|
| ∽ |
|
| ≃ |
|
| ⋍ |
|
| ≈ |
|
| ≅ |
|
| < |
|
| > |
|
| ≤ |
|
| ≥ |
|
| ∪ |
|
| ∩ |
|
| ⊂ |
|
| ⊃ |
|
| ∈ |
|
| ∋ |
|
| ∉ |
|
| ∌ |
|
| ⊕ |
|
| ⨁ |
|
| ⊗ |
|
| ⨂ |
Ensembles de nombres
Parmi les caractères spéciaux html, certains peuvent être utilisés directement pour noter les ensembles de nombres, réel, entiers naturels, entiers relatifs, et rationnels:html | Latex | affichage |
|
| ℝ |
|
| ℤ |
|
| ℕ |
|
| ℚ |
.Rset::before{content:"I";
display:inline-block;text-align:right;
width:.3em;margin-right:-.1em
}
.Qset:before{content:"I";font-family:arial;
display:inline-block;text-align:right;font-size:.9em;
width:.3em;margin-right:-.45em
}
.Zset{font-family:arial;}
.Zset::before{content:"Z";font-family:arial;
text-align:right;margin-right:-.4em;
}
puis, par exemple,
<span class="math">
<span class="Rset">N</span>
⊂
<span class="Zset">Z</span>
⊂
<span class="Qset">Q</span>
⊂
<span class="Rset">R</span>
</span>
donne
N
⊂
Z
⊂
Q
⊂
R
Autres symboles
html | Latex | affichage |
|
| ∞ |
|
| ∀ |
|
| ∃ |
|
| × |
|
| ∑ |
|
| ∏ |
|
| ∝ |
|
| ∂ |
|
| ø |
|
| ∅ |
|
| ∫ |
|
| ⊥ |
|
| 〈 |
|
| 〉 |
|
| ∗ |
|
| ℜ |
|
| ℑ |
|
| % |
|
| ‰ |
|
| ± |
|
| ° |
|
| ✓ |
|
| ✗ |
|
| ≺ |
|
| ≻ |
Quelques autres exemples, laplacien, gradient, ...
Définition d'une fonction
On écrit la définition, assez courante, d'une fonction
<span class="math">
<i>f</i>
<span class="syst">
<span class="align">
<span class="row">
<span class="cell"><span class="Rset">R</span></span>
<span class="cell">→</span>
<span class="cell l"><span class="Rset">R</span></span>
</span>
<span class="row">
<span class="cell"><i>x</i></span>
<span class="cell">↦</span>
<span class="cell r">3<i>x</i><sup>2</sup>+2</span>
</span>
</span>
</span>
</span>
pour obtenir
f :
R
→
R
x
↦
3x2+2
laplacien, gradient, ...
Le gradient d'une fonction
f : R2→R est
∇f=
∂f∂x
∂f∂y
et son laplacien
Δf=
∂2f
∂x2
+
∂2f
∂y2
Avec:
Le gradient d'une fonction
<span class="math"><i>f</i> :
<span class="Rset">R</span> <sup>2</sup> → <span class="Rset">R</span>
</span> est
<span class="math">
<span class="vect">∇</span><i>f</i>=
<span class="matrix">
<span class="row">
<span class="aij">
<span class="frac">
<span class="num">∂<i>f</i></span>
<span class="fracbar">/</span>
<span class="den">∂<i>x</i></span>
</span>
</span>
</span>
<span class="row">
<span class="aij">
<span class="frac">
<span class="num">∂<i>f</i></span>
<span class="fracbar">/</span>
<span class="den">∂<i>y</i></span>
</span>
</span>
</span>
</span>
</span>
et son laplacien
<span class="math ct">Δ<i>f</i>=
<span class="frac">
<span class="num">∂<sup>2</sup><i>f</i></span>
<span class='fracbar'>/</span>
<span class="den">∂<i>x</i><sup>2</sup></span>
</span>
+
<span class="frac">
<span class="num">∂<sup>2</sup><i>f</i></span>
<span class='fracbar'>/</span>
<span class="den">∂<i>y</i><sup>2</sup></span>
</span>
</span>
Calcul complet d'intégration
En combinant équations sur plusieurs lignes et intégrale,
on peut écrire le calcul complet
∫
01
x
x2+1
dx
=
12
lnx2+1
01
=
12
ln12+1
−
1
2
ln02+1
=
12
ln2
Convertisseur
Expression:
❌
2*e^(-x^2)
html:
1+
x+2
x+3
Code html:
Quelques autres références:
- Affichage de formules mathématiques en html+css
- Écrire des équations mathématiques et chimiques sur le web avec le css
- Caractères spéciaux et entités HTML
Paragraphe de tests...
le +∞∑n=3
le →u
ou abu
et
a →= 3
→AB
pour
a def= 3
et
un +∞plim∼
1
n2
ainsi que x → −∞
et
x→−∞lim
f (x) = l
et
aalim
et
aalim
et
aAlim
et
AAlim
AAA
→a
et
→a→
et
a
un
x+∞
aa
lim∼
1
n2
<span class="math">
<i>f</i>
<span class="syst">
<span class="align">
<span class="row">
<span class="cell"><span class="Rset">R</span></span>
<span class="cell">→</span>
<span class="cell l"><span class="Rset">R</span></span>
</span>
<span class="row">
<span class="cell"><i>x</i></span>
<span class="cell">↦</span>
<span class="cell r">3<i>x</i><sup>2</sup>+2</span>
</span>
</span>
</span>
</span>
Le gradient d'une fonction
<span class="math"><i>f</i> :
<span class="Rset">R</span> <sup>2</sup> → <span class="Rset">R</span>
</span> est
<span class="math">
<span class="vect">∇</span><i>f</i>=
<span class="matrix">
<span class="row">
<span class="aij">
<span class="frac">
<span class="num">∂<i>f</i></span>
<span class="fracbar">/</span>
<span class="den">∂<i>x</i></span>
</span>
</span>
</span>
<span class="row">
<span class="aij">
<span class="frac">
<span class="num">∂<i>f</i></span>
<span class="fracbar">/</span>
<span class="den">∂<i>y</i></span>
</span>
</span>
</span>
</span>
</span>
<span class="math ct">Δ<i>f</i>=
<span class="frac">
<span class="num">∂<sup>2</sup><i>f</i></span>
<span class='fracbar'>/</span>
<span class="den">∂<i>x</i><sup>2</sup></span>
</span>
+
<span class="frac">
<span class="num">∂<sup>2</sup><i>f</i></span>
<span class='fracbar'>/</span>
<span class="den">∂<i>y</i><sup>2</sup></span>
</span>
</span>
Expression:
❌
2*e^(-x^2)
html:
1+
x+2
x+3
Code html: