diff options
| author | Gaspard Coulet <gaspard.coulet@mines-ales.org> | 2021-04-28 23:05:53 +0200 |
|---|---|---|
| committer | Gaspard Coulet <gaspard.coulet@mines-ales.org> | 2021-04-28 23:05:53 +0200 |
| commit | 9fe033ea88c2f705ec18c232873d056e0c229d72 (patch) | |
| tree | 0647dc8c51610c7336c88c04de2068ea14b21e17 /sem_4/Algo/TP4/SortieLatex.cpp | |
Initial commit
Diffstat (limited to 'sem_4/Algo/TP4/SortieLatex.cpp')
| -rw-r--r-- | sem_4/Algo/TP4/SortieLatex.cpp | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/sem_4/Algo/TP4/SortieLatex.cpp b/sem_4/Algo/TP4/SortieLatex.cpp new file mode 100644 index 0000000..b400d1a --- /dev/null +++ b/sem_4/Algo/TP4/SortieLatex.cpp @@ -0,0 +1,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 |
