1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
//SortieLatex.cpp
#include <iostream>
#include <fstream>
#include <sstream>
#include <cstdlib>
#include <stdlib.h>
typedef int Valeur;
class Sommet;
typedef Sommet* AB;
void SortieLatex(AB Ar, std::string filepath);
class Sommet {
protected:
Valeur racine;
AB Pere,SAG,SAD;
bool FGP;
// Unused:
// int hauteur,balanceGmoinsD;
public:
Sommet(Valeur v);
Sommet(Sommet& s);
AB remonterToutEnHaut();
void GrefferSAG(AB g);
void GrefferSAD(AB d);
void SupprimerSAG();
void SupprimerSAD();
bool FeuilleP();
void RemplacerPourLePerePar(AB);
friend std::string* TikzRecursAB(int ligne,int gauche, int droite, int numeroPere, int typeFils, AB Ar);
};
std::string* TikzRecursAB(int ligne,int gauche, int droite, int numeroPere, int typeFils, AB Ar);
std::string * TikzRecursAB(int ligne,int gauche, int droite, int numeroPere, int typeFils, AB Ar){
std::ostringstream ossnum, osslign,osscol,ossnumPere, ossbal, ossnum2Pere,ossnumRac;
std::string stres("");
if (Ar) {
ossnumPere<<numeroPere;
ossnumRac<<"(\\textcolor{red}{" << Ar->racine << "})\\\\this=\\textcolor{red}{" <<Ar <<"}\\\\Pere=\\textcolor{red}{"<<Ar->Pere << "} (FGP=\\textcolor{red}{" << (Ar->FGP?"Gauche":"Droit") <<"})";
if (Ar->Pere )ossnum2Pere<<Ar->Pere->racine; else ossnum2Pere<<0;
int numero;
if (typeFils==-1) { numero=1; } else { numero= 2*numeroPere + typeFils; }
ossnum<<numero;
osslign<<ligne;
int mil = (gauche + droite)/2;
osscol<<mil;
stres="\\node[draw, color=black, rounded corners=5pt, text width=3cm, text centered] (SZ" + ossnum.str() + ") at " +
"(" + osscol.str() + ", " + osslign.str() + ") " +
"{ " + ossnumRac.str() + "};\n";
if (typeFils!=-1) stres+="\\draw[->, >=latex, color=blue] (SZ"+ossnumPere.str()+") -- (SZ"+ossnum.str() +");\n";
if (Ar->SAG) stres+=*TikzRecursAB(ligne-3,gauche,mil-13,numero,0,Ar->SAG);
if (Ar->SAD) stres+=*TikzRecursAB(ligne-3,mil+13,droite,numero,1,Ar->SAD);
}
return new std::string(stres);
}
std::string * TikzAB(AB Ar){
return TikzRecursAB(1,1,10,1,-1,Ar);
}
void SortieLatex(AB Ar, std::string filepath){ //don't insert garbage in filepath, its std::system-ised.
std::ofstream fichier(filepath.c_str(), std::ios::out | std::ios::trunc);
std::string preamb ("\\documentclass{article} \n \\usepackage{tikz} \n \\begin{document} \n \\resizebox{300pt}{!}{\n \\begin{tikzpicture}\n");
std::cout<<preamb<<"\n";
std::string post("\\end{tikzpicture}\n } \\end{document} \n"); //rsz box end?
std::cout<<post<<"\n";
std::cout<<*TikzAB(Ar)<<"\n";
std::string res1(preamb + *TikzAB(Ar));
std::string res(res1 + post);
//std::cout<<res1<<"\n";
fichier <<res<<"\n";
fichier.close();
std::ostringstream system_CARE;
// /dev/null 2>&1 isnt enough to mute pdflatex...
system_CARE << "mkdir pdflatex_temp > /dev/null 2>&1;"
<< "pdflatex -output-directory=\"./pdflatex_temp\" -interaction=nonstopmode \"" << filepath << "\" >/dev/null 2>&1;"
<< "mv ./pdflatex_temp/*.pdf ./ > /dev/null 2>&1;";
std::system(system_CARE.str().c_str());
return;
}
// g++ -c SortieLatex.cpp
|