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
|
//SortieLatex.cpp
#include <iostream>
#include <fstream>
#include <sstream>
typedef int Valeur;
class SommetABR;
typedef SommetABR* ABR;
void SortieLatex(ABR Ar);
class SommetABR {
protected:
Valeur racine;
ABR Pere,SAG, SAD;
int hauteur,balanceGmoinsD;
public:
SommetABR(Valeur v);
SommetABR(SommetABR& s);
ABR remonterToutEnHaut();
void GrefferSAG(ABR g);
void GrefferSAD(ABR d);
void SupprimerSAG();
void SupprimerSAD();
bool FeuilleP();
void RemplacerPourLePerePar(ABR);
friend std::string* TikzRecursABR(int ligne,int gauche, int droite, int numeroPere, int typeFils, ABR Ar);
};
std::string* TikzRecursABR(int ligne,int gauche, int droite, int numeroPere, int typeFils, ABR Ar);
std::string * TikzRecursABR(int ligne,int gauche, int droite, int numeroPere, int typeFils, ABR Ar){
std::ostringstream ossnum, osslign,osscol,ossnumPere, ossbal, ossnum2Pere,ossnumRac;
std::string stres("");
if (Ar) {
ossnumPere<<numeroPere;
ossnumRac<<Ar->racine;
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] (SZ" + ossnum.str() + ") at (" + osscol.str() + ", " + osslign.str() + ") { " + ossnumRac.str() + "};\n";
if (typeFils!=-1) stres+="\\draw (SZ"+ossnumPere.str()+") -- (SZ"+ossnum.str() +");\n";
if (Ar->SAG) stres+=*TikzRecursABR(ligne -1 ,gauche,mil-1, numero,0,Ar->SAG);
if (Ar->SAD) stres+=*TikzRecursABR(ligne - 1,mil+1,droite, numero,1,Ar->SAD);
}
return new std::string(stres);
}
std::string * TikzABR(ABR Ar){
return TikzRecursABR(1,1,10,1, -1,Ar);
}
void SortieLatex(ABR 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;"
<< "init_texlive;"<< "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
|