Aligner du texte mathématique

Tout ce qui concerne le langage Asymptote. Ce langage est utilisable sur le forum via les balises asy.
[participation réservée aux utilisateurs inscrits]
Règles du forum
Merci de soigner la rédaction de vos messages et de consulter ce sujet avant de poster. Pensez également à utiliser la fonction recherche du forum.
Romain Janvier
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 146
Inscription : lundi 23 août 2010, 14:57

Aligner du texte mathématique

Message non lu par Romain Janvier »

Bonjour,

En bidouillant un peu mon fichier sur les tableaux de proportionnalité pour afficher des égalité de fractions en mettant des fleches entre les dénominteurs et les numérateurs avec les simplications effectuées (par exemple ":3"), je me suis rendu compte que je n'arrivais pas à aligner correctement les fractions si elles n'avait pas la meme taille. Pour pouvoir mettre les fleches, j'utilise une picture, mais après lorsque je fais "add", ca foire un peu.

Code : Tout sélectionner

unitsize(1cm);
texpreamble("\newcommand{\dfrac}[2]{\displaystyle\frac{#1}{#2}}");

string s1="$\dfrac{4}{5}$";
string s2="$\dfrac{\ldots}{15}$";

pair[] calc(object o)
{
   pair[] rep;
   picture tmp;
   add(tmp,o);
   rep.push(size(tmp)/1cm);
   rep.push(min(tmp)/1cm);
   rep.push(max(tmp)/1cm);
   return rep;
}

object o1=Label(s1,(0,0),Align,basealign);
object o2=Label(s2,(0,0),Align,basealign);

pair[] rep1=calc(o1);
pair[] rep2=calc(o2);

label(s1,(0,0),Align,basealign);
label(s2,(1,0),Align,basealign);

//write(rep1);
//write(rep2);
add(o1,(2,0));
draw(shift((2,0))*box(rep1[1],rep1[2]));

add(o2,(3,0));
draw(shift((3,0))*box(rep2[1],rep2[2]));
dot((2,0));
dot((3,0));


object o3=Label(s1,(0,0),basealign);
object o4=Label(s2,(0,0),basealign);

pair[] rep3=calc(o3);
pair[] rep4=calc(o4);

label(s1,(0,-1),basealign);
label(s2,(1,-1),basealign);

//write(rep3);
//write(rep4);
add(o3,(2,-1));
draw(shift((2,-1))*box(rep3[1],rep3[2]));

add(o4,(3,-1));
draw(shift((3,-1))*box(rep4[1],rep4[2]));
dot((2,-1));
dot((3,-1));
test.png
test.png (4.7 Kio) Consulté 1769 fois
Si j'utilise Align, les fractions sont bien alignées, mais elles ne sont pas centrées horizontalement autour du point de départ. Si je l'enlève, elle sont bien centrées, mais pas alignées verticalement.

Comment faire pour qu'elles soient centrées horizontalement et alignées verticalement ? Je n'ai pas encore testé, mais est-ce qu'il faut soustraire la largeur divisée par 2 et rajouter labelmargin ou un truc comme cela ?
GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2042
Inscription : lundi 01 octobre 2007, 10:20

Re: Aligner du texte mathematique

Message non lu par GMaths »

Je n'ai peut-être pas compris ce que tu veux mais le point me semble bien placé.

Voilà ce que l'on obtient en compilant un tex :

Image
Romain Janvier
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 146
Inscription : lundi 23 août 2010, 14:57

Re: Aligner du texte mathematique

Message non lu par Romain Janvier »

Mon probleme, c'est que je veux decouper les expressions en morceaux, du genre "4/5" "=" ".../15" pour pouvoir calculer les dimensions des fractions et ensuite les relier avec des fleches. Le probleme c'est pour les placer ensuite. Mon probleme c'est que je n'arrivais pas à les aligner comme je voulais, mais je crois que j'ai trouvé. Ca m'aidera aussi à ameliorer mon fichier pour les tableaux de proportionnalité.
GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2042
Inscription : lundi 01 octobre 2007, 10:20

Re: Aligner du texte mathematique

Message non lu par GMaths »

Romain Janvier a écrit :Mon probleme, c'est que je veux decouper les expressions en morceaux, du genre "4/5" "=" ".../15" pour pouvoir calculer les dimensions des fractions et ensuite les relier avec des fleches. Le probleme c'est pour les placer ensuite. Mon probleme c'est que je n'arrivais pas à les aligner comme je voulais
Pourtant, dans ton premier cas, les deux points sont sur la ligne jaune (de ma figure) donc il semble bien que tes deux labels séparés se soient placés correctement l'un vis à vis de l'autre et vis à vis des points matérialisant la ligne de base.
Romain Janvier
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 146
Inscription : lundi 23 août 2010, 14:57

Re: Aligner du texte mathematique

Message non lu par Romain Janvier »

Oui, mais j'ai besoin d'avoir le point au milieu sur la ligne horizontale pour pouvoir ensuite placer mes fleches correctement, ou pour remplir mon tableau de proportionalité correctement (avec les nombres au milieu des cases). D'ailleurs cela semble etre un miracle que cela marche pour l'instant. Peut-etre parce que je n'utilisais pas de fractions...
GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2042
Inscription : lundi 01 octobre 2007, 10:20

Re: Aligner du texte mathematique

Message non lu par GMaths »

Pour donner des idées différentes :

Code : Tout sélectionner

real u=1;
unitsize(u*cm);
texpreamble("\newcommand{\dfrac}[2]{\displaystyle\frac{#1}{#2}}");
string[] s={"$\dfrac{4}{5}$",
            "$=$",
            "$\dfrac{\ldots\vphantom{1}}{15}$",
            "$=$",
            "$\dfrac{20}{\ldots}$",
            "$=$",
            "$\dfrac{4+\frac{?}{2}}{5+\dfrac{3}{2}}$"
            };
envelope[] env={box,
               box, // null ne fonctionne pas ! :-((
               box,
               box, // null ne fonctionne pas ! :-((
               box,
               box, // null ne fonctionne pas ! :-((
               roundbox
              };
pen[] couleur={red,
               nullpen, // pour compenser le problème précédent.
               blue,
               nullpen, // pour compenser le problème précédent.
               red,
               nullpen, // pour compenser le problème précédent.
               blue
              };
object[] obj=new object[s.length];
real dx=0;
for(int k=0; k<s.length; ++k){
    obj[k] = object(Label(s[k],(dx,0),Align,basealign),env[k],couleur[k]);
    dx+=((max(obj[k])-min(obj[k])).x/(u*cm));
}

frame o=pack(align=realEpsilon*E,obj[0],obj[1],obj[2],obj[3],obj[4],obj[5],obj[6]);
add(o);

draw((0,0)--(truepoint(E).x,0),dotted+red);

add(new void(picture pic, transform t) {
    draw(pic,point(obj[0],N,t){N}..tension 3 ..{S}point(obj[6],N,t),Arrow);
    draw(pic,"d\'elire",point(obj[6],SW,t){SW}.. {NW}point(obj[2],SE,t),.8green,Arrows);
});
Il y a au moins deux problèmes dans ce que je propose : je vous laisse les trouver. :-))

Je propose néanmoins l'exemple... car il a au moins une originalité : celle d'avoir utiliser une fonction que je n'avais jamais utilisée personnellement.

Image

PS : à ceux qui passeraient là par hasard, je vous rassure d'un point de vue mathématique : ce qui précède n'est qu'un exemple délirant... dont le petit intérêt n'est que la façon dont cela a été programmé, pour être capable d'aligner et de relier des expressions mathématiques de tailles différentes.
Romain Janvier
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 146
Inscription : lundi 23 août 2010, 14:57

Re: Aligner du texte mathematique

Message non lu par Romain Janvier »

Wao, pas mal. Mais le truc c'est que je ne veux pas passer par le "add(new void(picture pic, transform t) {" parce que si jamais tu veux recuperer les coordonnées des textes sur les fleches pour faire autre chose, cela devient la galere.

Par contre, tu devrais mettre des ArcArrow et à mon avis le \vphantom ne sert à rien. Mais je n'ai jamais vu la commande pack, ni ce realEpsilon. Et c'est bizarre que le roundbox empiete un peu sur le 2 en bas à droite.
GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2042
Inscription : lundi 01 octobre 2007, 10:20

Re: Aligner du texte mathematique

Message non lu par GMaths »

Romain Janvier a écrit :Wao, pas mal. Mais le truc c'est que je ne veux pas passer par le "add(new void(picture pic, transform t) {" parce que si jamais tu veux recuperer les coordonnées des textes sur les fleches pour faire autre chose, cela devient la galere.
Quelle autre chose ? Un exemple ? :roll:
Romain Janvier a écrit :Par contre, tu devrais mettre des ArcArrow
J'aime bien celles que j'ai mises. :-)
Romain Janvier a écrit :et à mon avis le \vphantom ne sert à rien.

Regarde ta figure et la mienne... et tu comprendras pourquoi je l'ai mis.
Romain Janvier a écrit :Mais je n'ai jamais vu la commande pack, ni ce realEpsilon.
Pour pack : +1.
Romain Janvier a écrit :Et c'est bizarre que le roundbox empiete un peu sur le 2 en bas à droite.
Cela arrive avec roundbox. Utiliser xmargin ou y margin pour améliorer les choses.
Romain Janvier
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 146
Inscription : lundi 23 août 2010, 14:57

Re: Aligner du texte mathematique

Message non lu par Romain Janvier »

Un truc comme cela par exemple :
cours-tableau-prop-prime2.png
Meme si là j'ai triché pour les fleches qui partent des autres fleches, mais on doit pouvoir le gerer plus facilement en utilisant ma "methode". Et puis honetement, j'avais bricolé avec ces void add(...) mais je ne comprends toujours pas ce que cela fait ni comment ca marche. Et si on les imbrique, cela devient n'importe quoi.

Pour le phantom, je pense qu'avec le Align et le basealign, ca passe, regarde mon premier exemple.
GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2042
Inscription : lundi 01 octobre 2007, 10:20

Re: Aligner du texte mathématique

Message non lu par GMaths »

Image

Cela complique un peu... mais on y arrive.

Il va de soi que si j'avais besoin d'une telle chose, très spécifique avec un signe égal une fois sur deux,
je peaufinerais en enlevant notamment la contrainte de devoir saisir ce qui les concerne dans les tableaux du départ.

Code : Tout sélectionner

real u=2;
unitsize(u*cm);
texpreamble("\newcommand{\dfrac}[2]{\displaystyle\frac{#1}{#2}}");
string[] s={"$\dfrac{4}{5}$",
            "$=$",
            "$\dfrac{\ldots\vphantom{1}}{15}$",
            "$=$",
            "$\dfrac{20}{\ldots}$",
            "$=$",
            "$\dfrac{\ldots\vphantom{1}}{20}$"
            };
envelope[] env={box,
               box, // null ne fonctionne pas ! :-((
               box,
               box, // null ne fonctionne pas ! :-((
               box,
               box, // null ne fonctionne pas ! :-((
               roundbox
              };
pen[] couleur={red,
               nullpen, // pour compenser le problème précédent.
               blue,
               nullpen, // pour compenser le problème précédent.
               red,
               nullpen, // pour compenser le problème précédent.
               blue
              };
object[] obj=new object[s.length];
real dx=0;
for(int k=0; k<s.length; ++k){
    obj[k] = object(Label(s[k],(dx,0),Align,basealign),env[k],couleur[k]);
    dx+=((max(obj[k])-min(obj[k])).x/(u*cm));
}

frame o=pack(align=realEpsilon*E,obj[0],obj[1],obj[2],obj[3],obj[4],obj[5],obj[6]);
add(o);

draw((0,0)--(truepoint(E).x,0),dotted+red);



add(new void(picture pic, transform t) {
    transform it=inverse(t);
    // Flèche noire
    draw(pic,point(obj[0],N,t){N}..tension 3 ..{S}point(obj[6],N,t),ArcArrows);
    
    // Flèche verte
    path flecheverte = point(obj[0],S,t){S}.. {N}point(obj[2],S,t);
    pair  posplus= point(flecheverte,.7);
    Label labplus=scale(.5)*"+",
          labelvert=Label(labplus,posplus);
    object lab = object(labelvert,box,nullpen);
    
    draw(pic,flecheverte,.8green,ArcArrows);

    // Flèche bleue
    draw(pic,(it*point(lab,S,t){SE}..tension 2 ..{N}point(obj[6],S,t)),blue,ArcArrow);
    
    // Ajout du +
    label(pic,labplus,posplus,Fill(white));
});
Dernière modification par GMaths le vendredi 14 janvier 2011, 22:37, modifié 1 fois.
GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2042
Inscription : lundi 01 octobre 2007, 10:20

Re: Aligner du texte mathematique

Message non lu par GMaths »

Romain Janvier a écrit :Pour le phantom, je pense qu'avec le Align et le basealign, ca passe, regarde mon premier exemple.
Je te le citais comme exemple du problème !! :lol:
Je regarde l'image et je vois que cela ne passe pas : pour la dernière fraction, le cadre est incorrect : pas de place pour écrire, là où il y a les trois points. :wink:
Je n'ai pas recompilé l'exemple pour voir s'il donne quelque chose de mieux que ce que l'image montre.
Romain Janvier
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 146
Inscription : lundi 23 août 2010, 14:57

Re: Aligner du texte mathématique

Message non lu par Romain Janvier »

Dans mon exemple, cela ne passe pas sur la 2e ligne parce que je n'ai pas mis le Align. Sinon sur la premiere ca passe.

Et bravo pour ton dernier exemple. Je me disais qu'avec une ellipse autour du + cela serait plus dur, mais en fait ca masque la jointure entre les fleches, donc ca doit etre encore plus simple...
GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2042
Inscription : lundi 01 octobre 2007, 10:20

Re: Aligner du texte mathématique

Message non lu par GMaths »

Romain Janvier a écrit :Sinon sur la premiere ca passe.
On ne doit pas parler de la même chose car voilà la première ligne (que j'ai vérifiée en compilant la première partie du code que tu as donné) et, en l'état, sans vphantom, la place pour compléter la dernière fraction n'est pas prévue !

Image

Pourtant, je pensais que ma phrase était claire :
pour la dernière fraction, le cadre est incorrect : pas de place pour écrire, là où il y a les trois points.
Romain Janvier
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 146
Inscription : lundi 23 août 2010, 14:57

Re: Aligner du texte mathématique

Message non lu par Romain Janvier »

Mince, je n'avais pas fait attention à ca. Si j'avais utilisé un phantom, je n'aurai pas eu tous ces problemes, mais je voulais un resultat plus "systematique". C'est decevant au final...

En tout cas merci pour tes renseignements.
GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2042
Inscription : lundi 01 octobre 2007, 10:20

Re: Aligner du texte mathématique

Message non lu par GMaths »

Romain Janvier a écrit :... mais je voulais un resultat plus "systematique". C'est decevant au final...
Je ne vois pas trop comment tu veux faire autrement que de prendre en compte ce que renseignes comme "string"... car si tu prévois des cadres d'une hauteur fixe pour le problème des zones à compléter, tu perdras forcément la souplesse de mettre des formules de hauteurs différentes.
Donc il suffit de définir une commande \pts dans le préambule qui prennent en compte le vphantom, quelque chose du genre :

Code : Tout sélectionner

\newcommand{\pts}[1][1cm]{\makebox[#1][l]{\vphantom{1}\textcolor{gray}{\dotfill}}}
voire mieux : prévoir une commande de syntaxe \sol{...}, où tu indiques la solution attendue sans l'afficher : mais le fait de renseigner la réponse permet de calculer la place à laisser, et de calculer la longueur de pointillés nécessaires.
c-top

Re: Aligner du texte mathematique

Message non lu par c-top »

Romain Janvier a écrit :Mais je n'ai jamais vu la commande pack, ni ce realEpsilon.
Tu as la liste complète (ou presque) des fonctions asymptote dans un petit fichier qui s'appelle
asy.list
À toi de le trouver dans ta distribution.
GMaths
Utilisateur chevronné
Utilisateur chevronné
Messages : 2042
Inscription : lundi 01 octobre 2007, 10:20

Re: Aligner du texte mathematique

Message non lu par GMaths »

c-top a écrit :asy.list
Dans la version svn uniquement.
Répondre
  • Sujets similaires
    Réponses
    Vues
    Dernier message