443 ((
TLatex&)text).Copy(*
this);
478 ((
TLatex&)obj).fTabSize = 0;
524 const char *tab[] = {
"alpha",
"beta",
"chi",
"delta",
"varepsilon",
"phi",
"gamma",
"eta",
"iota",
"varphi",
"kappa",
"lambda",
525 "mu",
"nu",
"omicron",
"pi",
"theta",
"rho",
"sigma",
"tau",
"upsilon",
"varomega",
"omega",
"xi",
"psi",
"zeta",
526 "Alpha",
"Beta",
"Chi",
"Delta",
"Epsilon",
"Phi",
"Gamma",
"Eta",
"Iota",
"vartheta",
527 "Kappa",
"Lambda",
"Mu",
"Nu",
"Omicron",
"Pi",
"Theta",
"Rho",
"Sigma",
"Tau",
528 "Upsilon",
"varsigma",
"Omega",
"Xi",
"Psi",
"Zeta",
"varUpsilon",
"epsilon"};
530 const char *
tab2[] = {
"leq",
"/",
"infty",
"voidb",
"club",
"diamond",
"heart",
531 "spade",
"leftrightarrow",
"leftarrow",
"uparrow",
"rightarrow",
532 "downarrow",
"circ",
"pm",
"doublequote",
"geq",
"times",
"propto",
533 "partial",
"bullet",
"divide",
"neq",
"equiv",
"approx",
"3dots",
534 "cbar",
"topbar",
"downleftarrow",
"aleph",
"Jgothic",
"Rgothic",
"voidn",
535 "otimes",
"oplus",
"oslash",
"cap",
"cup",
"supset",
"supseteq",
536 "notsubset",
"subset",
"subseteq",
"in",
"notin",
"angle",
"nabla",
537 "oright",
"ocopyright",
"trademark",
"prod",
"surd",
"upoint",
"corner",
"wedge",
538 "vee",
"Leftrightarrow",
"Leftarrow",
"Uparrow",
"Rightarrow",
539 "Downarrow",
"diamond",
"LT",
"void1",
"copyright",
"void3",
"sum",
540 "arctop",
"lbar",
"arcbottom",
"topbar",
"void8",
"bottombar",
"arcbar",
541 "ltbar",
"AA",
"aa",
"void06",
"GT",
"int",
"forall",
"exists" };
543 const char *
tab3[] = {
"bar",
"vec",
"dot",
"hat",
"ddot",
"acute",
"grave",
"check",
"tilde",
"slash"};
547 Int_t nBlancDeb=0,nBlancFin=0,l_nBlancDeb=0,l_nBlancFin=0;
560 if (nBlancDeb==l_nBlancDeb && nBlancFin==l_nBlancFin) cont =
kFALSE;
563 if (t[nBlancDeb]==
'{' && t[length-nBlancFin-1]==
'}') {
566 for(i=nBlancDeb;i<length-nBlancFin;i++) {
567 if (t[i] ==
'{' && !(i>0 && t[i-1] ==
'@')) nBrackets++;
568 if (t[i] ==
'}' && t[i-1]!=
'@') nBrackets--;
569 if (nBrackets==0 && i<length-nBlancFin-2) {
585 l_nBlancDeb = nBlancDeb;
586 l_nBlancFin = nBlancFin;
591 length -= nBlancFin+nBlancDeb;
593 Error(
"Analyse",
"It seems there is a syntax error in the TLatex string");
597 strncpy(text,t+nBlancDeb,length);
603 indiceSize = spec.
fSize;
606 specNewSize.
fSize = indiceSize;
615 Int_t opCurlyCurly = -1;
616 Int_t opSquareCurly = -1;
617 Int_t opCloseCurly = -2;
624 Int_t opSquareBracket = 0 ;
625 Int_t opBigCurly = 0 ;
628 Int_t abovePlace = 0 ;
636 Int_t opBackslash = 0;
637 Int_t opParallel = 0;
638 Int_t opSplitLine = -1;
648 for(i=0;i<length;i++) {
650 case '\'' : quote1 = !quote1 ; break ;
651 case '"' : quote2 = !quote2 ; break ;
657 if (!(i>0 && text[i-1] ==
'@')) nBrackets++;
662 if (!(i>0 && text[i-1] ==
'@')) nBrackets--;
664 if (i<length-1)
if (text[i+1]==
'{' && opCurlyCurly==-1) opCurlyCurly=i;
666 if (text[i+1]!=
'{' && !(text[i+2]==
'{' && (text[i+1]==
'^' || text[i+1]==
'_'))
667 && opCloseCurly==-2) opCloseCurly=i;
669 else if (i<length-1) {
670 if (text[i+1]!=
'{' && opCloseCurly==-2) opCloseCurly=i;
672 else if (opCloseCurly==-2) opCloseCurly=i;
678 if (!(i>0 && text[i-1] ==
'@')) nCroch++;
683 if (!(i>0 && text[i-1] ==
'@')) nCroch--;
695 strncpy(buf,&text[i],2);
696 if (strncmp(buf,
"^{",2)==0) {
697 if (opPower==-1 && nBrackets==0 && nCroch==0) opPower=i;
700 strncpy(buf1,&text[i-4],4);
701 if (strncmp(buf1,
"#int",4)==0) {
703 if (i>4 && opCloseCurly==-2) opCloseCurly=i-5;
705 if (strncmp(buf1,
"#sum",4)==0) {
707 if (i>4 && opCloseCurly==-2) opCloseCurly=i-5;
711 if (strncmp(buf,
"_{",2)==0) {
712 if (opUnder==-1 && nBrackets==0 && nCroch==0) opUnder=i;
715 strncpy(buf2,&text[i-4],4);
716 if (strncmp(buf2,
"#int",4)==0) {
718 if (i>4 && opCloseCurly==-2) opCloseCurly=i-5;
720 if (strncmp(buf2,
"#sum",4)==0) {
722 if (i>4 && opCloseCurly==-2) opCloseCurly=i-5;
726 if (strncmp(buf,
"]{",2)==0)
727 if (opSquareCurly==-1 && nBrackets==0 && nCroch==0) opSquareCurly=i;
730 if (text[i]==
'\\' || (text[i]==
'#' && !opFound && nBrackets==0 && nCroch==0)) {
734 strncpy(buf,&text[i+1],10);
735 if (strncmp(buf,
"splitline{",10)==0) {
736 opSplitLine=i; opFound =
kTRUE;
737 if (i>0 && opCloseCurly==-2) opCloseCurly=i-1;
743 strncpy(buf,&text[i+1],9);
744 if (!opBackslash && strncmp(buf,
"backslash",9)==0) {
745 opBackslash=1; opFound =
kTRUE;
746 if (i>0 && opCloseCurly==-2) opCloseCurly=i-1;
752 strncpy(buf,&text[i+1],8);
753 if (!opParallel && strncmp(buf,
"parallel",8)==0) {
754 opParallel=1; opFound =
kTRUE;
755 if (i>0 && opCloseCurly==-2) opCloseCurly=i-1;
761 strncpy(buf,&text[i+1],6);
762 if (strncmp(buf,
"lower[",6)==0 || strncmp(buf,
"lower{",6)==0) {
763 opLower=i; opFound =
kTRUE;
764 if (i>0 && opCloseCurly==-2) opCloseCurly=i-1;
767 if (strncmp(buf,
"scale[",6)==0 || strncmp(buf,
"scale{",6)==0) {
768 opScale=i; opFound =
kTRUE;
769 if (i>0 && opCloseCurly==-2) opCloseCurly=i-1;
772 if (strncmp(buf,
"color[",6)==0 || strncmp(buf,
"color{",6)==0) {
773 opColor=i; opFound =
kTRUE;
774 if (i>0 && opCloseCurly==-2) opCloseCurly=i-1;
780 strncpy(buf,&text[i+1],5);
781 if (strncmp(buf,
"frac{",5)==0) {
782 opFrac=i; opFound =
kTRUE;
783 if (i>0 && opCloseCurly==-2) opCloseCurly=i-1;
786 if (strncmp(buf,
"sqrt{",5)==0 || strncmp(buf,
"sqrt[",5)==0) {
787 opSqrt=i; opFound =
kTRUE;
788 if (i>0 && opCloseCurly==-2) opCloseCurly=i-1;
791 if (strncmp(buf,
"font{",5)==0 || strncmp(buf,
"font[",5)==0) {
792 opFont=i; opFound =
kTRUE;
793 if (i>0 && opCloseCurly==-2) opCloseCurly=i-1;
796 if (strncmp(buf,
"kern[",5)==0 || strncmp(buf,
"kern{",5)==0) {
797 opKern=i; opFound =
kTRUE;
798 if (i>0 && opCloseCurly==-2) opCloseCurly=i-1;
801 if (!opMinus && strncmp(buf,
"minus",5)==0) {
802 opMinus=1; opFound =
kTRUE;
803 if (i>0 && opCloseCurly==-2) opCloseCurly=i-1;
806 if (strncmp(buf,
"mbox[",5)==0 || strncmp(buf,
"mbox{",5)==0) {
807 opMbox=i; opFound =
kTRUE;
808 if (i>0 && opCloseCurly==-2) opCloseCurly=i-1;
814 strncpy(buf,&text[i+1],4);
815 if (!opOdot && strncmp(buf,
"odot",4)==0) {
816 opOdot=1; opFound =
kTRUE;
817 if (i>0 && opCloseCurly==-2) opCloseCurly=i-1;
820 if (!opHbar && strncmp(buf,
"hbar",4)==0) {
821 opHbar=1; opFound =
kTRUE;
822 if (i>0 && opCloseCurly==-2) opCloseCurly=i-1;
825 if (!opPerp && strncmp(buf,
"perp",4)==0) {
826 opPerp=1; opFound =
kTRUE;
827 if (i>0 && opCloseCurly==-2) opCloseCurly=i-1;
830 if (!opPlus && strncmp(buf,
"plus",4)==0) {
831 opPlus=1; opFound =
kTRUE;
832 if (i>0 && opCloseCurly==-2) opCloseCurly=i-1;
838 strncpy(buf,&text[i+1],3);
840 if (strncmp(buf,
"[]{",3)==0) {
841 opSquareBracket=1; opFound =
kTRUE;
842 if (i>0 && opCloseCurly==-2) opCloseCurly=i-1;
845 if (strncmp(buf,
"{}{",3)==0 ) {
846 opBigCurly=1; opFound =
kTRUE;
847 if (i>0 && opCloseCurly==-2) opCloseCurly=i-1;
850 if (strncmp(buf,
"||{",3)==0) {
851 opAbs=1; opFound =
kTRUE;
852 if (i>0 && opCloseCurly==-2) opCloseCurly=i-1;
855 if (strncmp(buf,
"(){",3)==0) {
856 opParen=1; opFound =
kTRUE;
857 if (i>0 && opCloseCurly==-2) opCloseCurly=i-1;
860 if (!opBox && strncmp(buf,
"Box",3)==0) {
861 opBox=1; opFound =
kTRUE;
862 if (i>0 && opCloseCurly==-2) opCloseCurly=i-1;
865 if (strncmp(buf,
"bf[",3)==0 || strncmp(buf,
"bf{",3)==0) {
866 opBf=i; opFound =
kTRUE;
867 if (i>0 && opCloseCurly==-2) opCloseCurly=i-1;
870 if (strncmp(buf,
"it[",3)==0 || strncmp(buf,
"it{",3)==0) {
871 opIt=i; opFound =
kTRUE;
872 if (i>0 && opCloseCurly==-2) opCloseCurly=i-1;
878 strncpy(buf,&text[i+1],2);
879 if (!opMp && strncmp(buf,
"mp",2)==0) {
880 opMp=1; opFound =
kTRUE;
881 if (i>0 && opCloseCurly==-2) opCloseCurly=i-1;
886 if (!opFound &&
UInt_t(length)>i+strlen(tab[k])) {
887 if (strncmp(&text[i+1],tab[k],strlen(tab[k]))==0) {
890 if (i>0 && opCloseCurly==-2) opCloseCurly=i-1;
895 if (!opFound &&
UInt_t(length)>i+strlen(tab3[k])) {
896 if (strncmp(&text[i+1],tab3[k],strlen(tab3[k]))==0) {
899 if (i>0 && opCloseCurly==-2) opCloseCurly=i-1;
906 if ((opSpec==-1 || strlen(tab2[k])>lastsize) &&
UInt_t(length)>i+strlen(tab2[k])) {
907 if (strncmp(&text[i+1],tab2[k],strlen(tab2[k]))==0) {
908 lastsize = strlen(tab2[k]);
911 if (i>0 && opCloseCurly==-2) opCloseCurly=i-1;
924 if (opCloseCurly>-1 && opCloseCurly<length-1) {
926 fs1 =
Anal1(spec,text,opCloseCurly+1);
927 fs2 =
Anal1(spec,text+opCloseCurly+1,length-opCloseCurly-1);
931 Analyse(x+fs1.
Width(),
y,spec,text+opCloseCurly+1,length-opCloseCurly-1);
932 Analyse(x,y,spec,text,opCloseCurly+1);
937 else if (opPower>-1 && opUnder>-1) {
942 switch (abovePlace) {
944 prop = .8 ; propU = 1.75 ;
947 prop = .9 ; propU = 1.75 ;
956 if (min >= 2 && strncmp(&text[min-2],
"{}",2)==0) {
959 snprintf(&text[ltext-2],length-(ltext-2),
"I ") ;
962 fs1 =
Anal1(spec,text,ltext);
963 fs2 =
Anal1(specNewSize,text+min+1,max-min-1);
964 fs3 =
Anal1(specNewSize,text+max+1,length-max-1);
975 if (opPower<opUnder) {
982 Analyse(x+addW,y+addH2,specNewSize,text+max+1,length-max-1);
983 Analyse(x+addW,y+addH1,specNewSize,text+min+1,max-min-1);
985 Double_t addW1, addW2, addH1, addH2;
987 pos = (m-fs1.
Width())/2;
988 if (opPower<opUnder) {
990 addW1 = (m-fs2.
Width())/2;
992 addW2 = (m-fs3.
Width())/2;
995 addW1 = (m-fs2.
Width())/2;
997 addW2 = (m-fs3.
Width())/2;
1000 Analyse(x+addW2,y+addH2,specNewSize,text+max+1,length-max-1);
1001 Analyse(x+addW1,y+addH1,specNewSize,text+min+1,max-min-1);
1004 if (min >= 2 && strncmp(&text[min-2],
"{}",2)==0) {
1005 snprintf(&text[min-2],length-(min-2),
" ") ;
1006 Analyse(x+pos,y,spec,text,min-1);
1008 Analyse(x+pos,y,spec,text,min);
1013 if (opPower<opUnder) {
1023 if (opPower<opUnder) {
1032 else if (opPower>-1) {
1035 switch (abovePlace) {
1037 prop = 1.75 ; break ;
1039 prop = 1.75; break ;
1043 Int_t ltext = opPower ;
1044 if (ltext >= 2 && strncmp(&text[ltext-2],
"{}",2)==0) {
1047 snprintf(&text[ltext-2],length-(ltext-2),
"I ") ;
1050 fs1 =
Anal1(spec,text,ltext);
1051 fs2 =
Anal1(specNewSize,text+opPower+1,length-opPower-1);
1060 if (over <= 0) over = 1.5*fs2.
Over();
1069 Analyse(x+pos2,y-fs1.
Over()*prop-fs2.
Under(),specNewSize,text+opPower+1,length-opPower-1);
1071 if (opPower >= 2 && strncmp(&text[opPower-2],
"{}",2)==0) {
1072 snprintf(&text[opPower-2],length-(opPower-2),
" ") ;
1073 Analyse(x+pos,y,spec,text,opPower-1);
1075 Analyse(x+pos,y,spec,text,opPower);
1086 else if (opUnder>-1) {
1092 Int_t ltext = opUnder ;
1093 if (ltext >= 2 && strncmp(&text[ltext-2],
"{}",2)==0) {
1096 snprintf(&text[ltext-2],length-(ltext-2),
"I ") ;
1099 fs1 =
Anal1(spec,text,ltext);
1100 fs2 =
Anal1(specNewSize,text+opUnder+1,length-opUnder-1);
1108 Analyse(x+fs1.
Width()+xfpos,y+fs1.
Under()+fs2.
Over()*fpos,specNewSize,text+opUnder+1,length-opUnder-1);
1116 Analyse(x+pos2,y+fs1.
Under()*prop+fs2.
Over(),specNewSize,text+opUnder+1,length-opUnder-1);
1118 if (opUnder >= 2 && strncmp(&text[opUnder-2],
"{}",2)==0) {
1119 snprintf(&text[opUnder-2],length-(opUnder-2),
" ") ;
1120 Analyse(x+pos,y,spec,text,opUnder-1);
1122 Analyse(x+pos,y,spec,text,opUnder);
1134 fs1 =
Anal1(spec,text+4,length-4);
1136 fs1 =
Analyse(x+square,y,spec,text+4,length-4);
1152 fs1 =
Anal1(spec,text+5,length-5);
1154 fs1 =
Analyse(x+1.3*square,y,spec,text+5,length-5);
1166 fs1 =
Anal1(spec,text+5,length-5);
1168 fs1 =
Analyse(x+square,y,spec,text+5,length-5);
1181 DrawLine(x,y-0.8*square,x+0.75*square,y-square,spec);
1188 fs1 =
Anal1(spec,text+6,length-6);
1190 fs1 =
Analyse(x+square,y,spec,text+6,length-6);
1209 fs1 =
Anal1(spec,text+5,length-5);
1211 fs1 =
Analyse(x+square,y,spec,text+5,length-5);
1230 fs1 =
Anal1(spec,text+3,length-3);
1232 fs1 =
Analyse(x+square,y,spec,text+3,length-3);
1251 fs1 =
Anal1(spec,text+5,length-5);
1253 fs1 =
Analyse(x+0.5*square,y,spec,text+5,length-5);
1264 else if (opBackslash) {
1267 fs1 =
Anal1(spec,text+10,length-10);
1269 fs1 =
Analyse(x+square,y,spec,text+10,length-10);
1285 else if (opParallel) {
1288 fs1 =
Anal1(spec,text+9,length-9);
1290 fs1 =
Analyse(x+0.5*square,y,spec,text+9,length-9);
1300 else if (opGreek>-1) {
1303 char letter = 97 + opGreek;
1305 if (opGreek>25) letter -= 58;
1306 if (opGreek == 52) letter =
'\241';
1307 if (opGreek == 53) letter =
'\316';
1309 fs1 =
Anal1(newSpec,&letter,1);
1310 fs2 =
Anal1(spec,text+strlen(tab[opGreek])+1,length-strlen(tab[opGreek])-1);
1314 Analyse(x+fs1.
Width(),
y,spec,text+strlen(tab[opGreek])+1,length-strlen(tab[opGreek])-1);
1315 Analyse(x,y-yoffset,newSpec,&letter,1);
1321 else if (opSpec>-1) {
1324 char letter =
'\243' + opSpec;
1325 if(opSpec == 75 || opSpec == 76) {
1327 if (
gVirtualX->InheritsFrom(
"TGCocoa")) {
1328 if (opSpec == 75) letter =
'\201';
1329 if (opSpec == 76) letter =
'\214';
1331 if (opSpec == 75) letter =
'\305';
1332 if (opSpec == 76) letter =
'\345';
1335 if(opSpec == 80 || opSpec == 81) {
1336 if (opSpec == 80) letter =
'\042';
1337 if (opSpec == 81) letter =
'\044';
1345 }
else if (opSpec==79) {
1349 fs1 =
Anal1(newSpec,&letter,1);
1350 if (opSpec == 79 || opSpec == 66)
1353 fs2 =
Anal1(spec,text+strlen(tab2[opSpec])+1,length-strlen(tab2[opSpec])-1);
1357 Analyse(x+fs1.
Width(),
y,spec,text+strlen(tab2[opSpec])+1,length-strlen(tab2[opSpec])-1);
1358 if (opSpec!=66 && opSpec!=79)
1359 Analyse(x,y,newSpec,&letter,1);
1366 else if (opAbove>-1) {
1368 fs1 =
Anal1(spec,text+strlen(tab3[opAbove])+1,length-strlen(tab3[opAbove])-1);
1372 Analyse(x,y,spec,text+strlen(tab3[opAbove])+1,length-strlen(tab3[opAbove])-1);
1378 ypos = y-fs1.
Over()-sub ;
1383 y0 = y-sub-fs1.
Over() ;
1385 x1 = x+fs1.
Width() ;
1391 x1 = x+fs1.
Width()/2-3*sub/4 ;
1392 x2 = x+fs1.
Width()/2+3*sub/4 ;
1393 y1 = y-sub-fs1.
Over() ;
1397 x2 = x+fs1.
Width()/2 ;
1400 x1 = x2-fs1.
Width()/3 ;
1401 x3 = x2+fs1.
Width()/3 ;
1406 x1 = x+fs1.
Width()/2-9*sub/4 ;
1407 x2 = x+fs1.
Width()/2-3*sub/4 ;
1408 x3 = x+fs1.
Width()/2+9*sub/4 ;
1409 x4 = x+fs1.
Width()/2+3*sub/4 ;
1410 y1 = y-sub-fs1.
Over() ;
1415 x1 = x+fs1.
Width()/2;
1416 y1 = y +sub -fs1.
Over() ;
1422 x1 = x+fs1.
Width()/2-sub;
1423 y1 = y-sub-fs1.
Over() ;
1429 x1 = x+fs1.
Width()/2 ;
1432 y1 = y-sub-fs1.
Over() ;
1437 x2 = x+fs1.
Width()/2 ;
1438 y2 = y -fs1.
Over() ;
1445 if (
gVirtualX->InheritsFrom(
"TGCocoa")) y2 -= 4.7*sub;
1450 Double_t xx =
gPad->AbsPixeltoX(
Int_t((x2-xOrigin)*cosang+(y2-yOrigin)*sinang+xOrigin));
1451 Double_t yy =
gPad->AbsPixeltoY(
Int_t((x2-xOrigin)*-sinang+(y2-yOrigin)*cosang+yOrigin));
1462 xx =
gPad->AbsPixeltoX(
Int_t((x2-xOrigin)*cosang+(y22-yOrigin)*sinang+xOrigin));
1463 yy =
gPad->AbsPixeltoY(
Int_t((x2-xOrigin)*-sinang+(y22-yOrigin)*cosang+yOrigin));
1470 x1 = x + 0.8*fs1.
Width();
1471 y1 = y -fs1.
Over() ;
1472 x2 = x + 0.3*fs1.
Width();
1473 y2 = y1 + 1.2*fs1.
Height();
1479 if (opAbove==1) div=4;
1482 else if (opSquareBracket) {
1486 fs1 =
Anal1(spec,text+3,length-3);
1490 Analyse(x+l2+l,y,spec,text+3,length-3);
1502 Double_t radius2,radius1 , dw, l2 = l/2 ;
1505 fs1 =
Anal1(spec,text+3,length-3);
1508 radius1 = radius2 * 2 / 3;
1513 radius1 = radius2 * 2 / 3;
1520 Analyse(x+3*l2+dw,y,spec,text+3,length-3);
1529 fs1 =
Anal1(spec,text+3,length-3);
1533 Analyse(x+l2+l,y,spec,text+3,length-3);
1539 else if (opBigCurly) {
1545 fs1 =
Anal1(spec,text+3,length-3);
1556 Analyse(x+l+ltip+l2,y,spec,text+3,length-3);
1559 DrawLine(x+l2+ltip,y-fs1.
Over(),x+l2+ltip,y2-ltip,spec);
1565 DrawLine(x+l2,y2,x+l2+ltip,y2-ltip,spec);
1566 DrawLine(x+l2,y2,x+l2+ltip,y2+ltip,spec);
1581 else if (opFrac>-1) {
1582 if (opCurlyCurly==-1) {
1584 fError =
"Missing denominator for #frac";
1589 fs1 =
Anal1(spec,text+opFrac+6,opCurlyCurly-opFrac-6);
1590 fs2 =
Anal1(spec,text+opCurlyCurly+2,length-opCurlyCurly-3);
1604 Analyse(x+addW2,y+fs2.
Over()-height,spec,text+opCurlyCurly+2,length-opCurlyCurly-3);
1605 Analyse(x+addW1,y-fs1.
Under()-3*height,spec,text+opFrac+6,opCurlyCurly-opFrac-6);
1613 else if (opSplitLine>-1) {
1614 if (opCurlyCurly==-1) {
1616 fError =
"Missing second line for #splitline";
1621 fs1 =
Anal1(spec,text+opSplitLine+11,opCurlyCurly-opSplitLine-11);
1622 fs2 =
Anal1(spec,text+opCurlyCurly+2,length-opCurlyCurly-3);
1628 Analyse(x,y+fs2.
Over()-height,spec,text+opCurlyCurly+2,length-opCurlyCurly-3);
1629 Analyse(x,y-fs1.
Under()-3*height,spec,text+opSplitLine+11,opCurlyCurly-opSplitLine-11);
1635 else if (opSqrt>-1) {
1637 if (opSquareCurly>-1) {
1639 fs1 =
Anal1(specNewSize,text+opSqrt+6,opSquareCurly-opSqrt-6);
1640 fs2 =
Anal1(spec,text+opSquareCurly+1,length-opSquareCurly-1);
1646 fs1 =
Anal1(spec,text+opSqrt+5,length-opSqrt-5);
1651 if (opSquareCurly>-1) {
1659 Analyse(x+pas2,y,spec,text+opSquareCurly+1,length-opSquareCurly-1);
1660 Analyse(x,y-fs2.
Over()-fs1.
Under(),specNewSize,text+opSqrt+6,opSquareCurly-opSqrt-6);
1680 DrawLine(x1-2*dx,y1,x1-dx,y2,spec);
1688 else if (opColor>-1) {
1689 if (opSquareCurly==-1) {
1691 fError =
"Missing color number. Syntax is #color[(Int_t)nb]{ ... }";
1696 strncpy(nb,text+opColor+7,opSquareCurly-opColor-7);
1697 nb[opSquareCurly-opColor-7] = 0;
1698 if (sscanf(nb,
"%d",&newSpec.
fColor) < 1) {
1701 fError =
"Invalid color number. Syntax is #color[(Int_t)nb]{ ... }";
1706 result =
Anal1(newSpec,text+opSquareCurly+1,length-opSquareCurly-1);
1708 Analyse(x,y,newSpec,text+opSquareCurly+1,length-opSquareCurly-1);
1711 else if (opFont>-1) {
1712 if (opSquareCurly==-1) {
1714 fError =
"Missing font number. Syntax is #font[nb]{ ... }";
1719 strncpy(nb,text+opFont+6,opSquareCurly-opFont-6);
1720 nb[opSquareCurly-opFont-6] = 0;
1721 if (sscanf(nb,
"%d",&newSpec.
fFont) < 1) {
1724 fError =
"Invalid font number. Syntax is #font[(Int_t)nb]{ ... }";
1729 result =
Anal1(newSpec,text+opSquareCurly+1,length-opSquareCurly-1);
1731 Analyse(x,y,newSpec,text+opSquareCurly+1,length-opSquareCurly-1);
1734 else if (opKern>-1) {
1735 if (opSquareCurly==-1) {
1737 fError =
"Missing horizontal shift number. Syntax is #kern[dx]{ ... }";
1741 strncpy(dxc,text+opKern+6,opSquareCurly-opKern-6);
1742 dxc[opSquareCurly-opKern-6] = 0;
1744 if (sscanf(dxc,
"%f",&dx) < 1) {
1747 fError =
"Invalid horizontal shift number. Syntax is #kern[(Float_t)dx]{ ... }";
1752 fs1 =
Anal1(spec,text+opSquareCurly+1,length-opSquareCurly-1);
1759 Analyse(x + ddx,y,spec,text+opSquareCurly+1,length-opSquareCurly-1);
1762 else if (opLower>-1) {
1763 if (opSquareCurly==-1) {
1765 fError =
"Missing vertical shift number. Syntax is #lower[dy]{ ... }";
1769 strncpy(dyc,text+opLower+7,opSquareCurly-opLower-7);
1770 dyc[opSquareCurly-opLower-7] = 0;
1772 if (sscanf(dyc,
"%f",&dy) < 1) {
1775 fError =
"Invalid vertical shift number. Syntax is #lower[(Float_t)dy]{ ... }";
1780 fs1 =
Anal1(spec,text+opSquareCurly+1,length-opSquareCurly-1);
1787 Analyse(x,y + ddy,spec,text+opSquareCurly+1,length-opSquareCurly-1);
1790 else if (opScale>-1) {
1791 if (opSquareCurly==-1) {
1793 fError =
"Missing scale factor. Syntax is #scale[(Double_t)nb]{ ... }";
1798 strncpy(nb,text+opScale+7,opSquareCurly-opScale-7);
1799 nb[opSquareCurly-opScale-7] = 0;
1800 if (sscanf(nb,
"%lf",&newSpec.
fSize) < 1) {
1803 fError =
"Invalid scale factor. Syntax is #factor[(Double_t)nb]{ ... }";
1809 result =
Anal1(newSpec,text+opSquareCurly+1,length-opSquareCurly-1);
1811 Analyse(x,y,newSpec,text+opSquareCurly+1,length-opSquareCurly-1);
1816 Int_t lut[] = {3, 13, 1, 6, 7, 4, 5, 10, 11, 8, 9, 12, 2, 14, 15};
1818 if ((fontId >= 1) && (fontId <= (
Int_t)(
sizeof(lut)/
sizeof(lut[0])))) fontId = lut[fontId-1];
1819 newSpec.
fFont = fontId*10 + newSpec.
fFont%10;
1821 fs1 =
Anal1(newSpec,text+3,length-3);
1825 Analyse(x,y,newSpec,text+3,length-3);
1829 else if (opMbox>-1) {
1832 fs1 =
Anal1(newSpec,text+5,length-5);
1836 Analyse(x,y,newSpec,text+5,length-5);
1842 Int_t lut[] = {13, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 15, 1, 14, 12};
1844 if ((fontId >= 1) && (fontId <= (
Int_t)(
sizeof(lut)/
sizeof(lut[0])))) fontId = lut[fontId-1];
1845 newSpec.
fFont = fontId*10 + newSpec.
fFont%10;
1848 fs1 =
Anal1(newSpec,text+3,length-3);
1852 Analyse(x,y,newSpec,text+3,length-3);
1866 Int_t leng = strlen(text) ;
1868 quote1 = quote2 =
kFALSE ;
1870 for (i=0 ; i<leng ; i++) {
1872 case '\'' : quote1 = !quote1 ; break ;
1873 case '"' : quote2 = !quote2 ; break ;
1876 if (text[i] ==
'@') {
1878 if ( *(p+1) ==
'{' || *(p+1) ==
'}' || *(p+1) ==
'[' || *(p+1) ==
']') {
1895 gPad->PaintText(xx,yy,text);
1945 Double_t xx =
gPad->AbsPixeltoX(
Int_t((x1-xOrigin)*cosang+(y1-yOrigin)*sinang+xOrigin));
1946 Double_t yy =
gPad->AbsPixeltoY(
Int_t((x1-xOrigin)*-sinang+(y1-yOrigin)*cosang+yOrigin));
1948 Double_t xx2 =
gPad->AbsPixeltoX(
Int_t((x2-xOrigin)*cosang+(y2-yOrigin)*sinang+xOrigin));
1949 Double_t yy2 =
gPad->AbsPixeltoY(
Int_t((x2-xOrigin)*-sinang+(y2-yOrigin)*cosang+yOrigin));
1953 gPad->PaintLine(xx,yy,xx2,yy2);
1967 const Int_t np = 40;
1975 for (
Int_t i=0;i<=np;i++) {
1979 x[i] =
gPad->AbsPixeltoX(
Int_t( dx*cosang+ dy*sinang +xOrigin));
1980 y[i] =
gPad->AbsPixeltoY(
Int_t(-dx*sinang+ dy*cosang +yOrigin));
1982 gPad->PaintPolyLine(np+1,x,y);
1998 const Int_t np = 40;
2006 for (
Int_t i=0;i<=np;i++) {
2010 x[i] =
gPad->AbsPixeltoX(
Int_t( dx*cosang+dy*sinang +xOrigin));
2011 y[i] =
gPad->AbsPixeltoY(
Int_t(-dx*sinang+dy*cosang +yOrigin));
2013 gPad->PaintPolyLine(np+1,x,y);
2042 if (size<=0 || strlen(text1) <= 0)
return;
2052 if (t.Index(
"#")>=0 || t.Index(
"^")>=0 || t.Index(
"\\")>=0) {
2053 t.ReplaceAll(
"#LT",
"\\langle");
2054 t.ReplaceAll(
"#GT",
"\\rangle");
2055 t.ReplaceAll(
"#club",
"\\clubsuit");
2056 t.ReplaceAll(
"#spade",
"\\spadesuit");
2057 t.ReplaceAll(
"#heart",
"\\heartsuit");
2058 t.ReplaceAll(
"#diamond",
"\\diamondsuit");
2059 t.ReplaceAll(
"#voidn",
"\\wp");
2060 t.ReplaceAll(
"#voidb",
"f");
2061 t.ReplaceAll(
"#ocopyright",
"\\copyright");
2062 t.ReplaceAll(
"#trademark",
"TM");
2063 t.ReplaceAll(
"#void3",
"TM");
2064 t.ReplaceAll(
"#oright",
"R");
2065 t.ReplaceAll(
"#void1",
"R");
2066 t.ReplaceAll(
"#3dots",
"\\ldots");
2067 t.ReplaceAll(
"#lbar",
"\\mid");
2068 t.ReplaceAll(
"#bar",
"\\wwbar");
2069 t.ReplaceAll(
"#void8",
"\\mid");
2070 t.ReplaceAll(
"#divide",
"\\div");
2071 t.ReplaceAll(
"#Jgothic",
"\\Im");
2072 t.ReplaceAll(
"#Rgothic",
"\\Re");
2073 t.ReplaceAll(
"#doublequote",
"\"");
2074 t.ReplaceAll(
"#plus",
"+");
2075 t.ReplaceAll(
"#minus",
"-");
2076 t.ReplaceAll(
"#/",
"/");
2077 t.ReplaceAll(
"#upoint",
".");
2078 t.ReplaceAll(
"#aa",
"\\mbox{\\aa}");
2079 t.ReplaceAll(
"#AA",
"\\mbox{\\AA}");
2081 t.ReplaceAll(
"#omicron",
"o");
2082 t.ReplaceAll(
"#Alpha",
"A");
2083 t.ReplaceAll(
"#Beta",
"B");
2084 t.ReplaceAll(
"#Epsilon",
"E");
2085 t.ReplaceAll(
"#Zeta",
"Z");
2086 t.ReplaceAll(
"#Eta",
"H");
2087 t.ReplaceAll(
"#Iota",
"I");
2088 t.ReplaceAll(
"#Kappa",
"K");
2089 t.ReplaceAll(
"#Mu",
"M");
2090 t.ReplaceAll(
"#Nu",
"N");
2091 t.ReplaceAll(
"#Omicron",
"O");
2092 t.ReplaceAll(
"#Rho",
"P");
2093 t.ReplaceAll(
"#Tau",
"T");
2094 t.ReplaceAll(
"#Chi",
"X");
2095 t.ReplaceAll(
"#varomega",
"\\varpi");
2097 t.ReplaceAll(
"#varUpsilon",
"?");
2098 t.ReplaceAll(
"#corner",
"?");
2099 t.ReplaceAll(
"#ltbar",
"?");
2100 t.ReplaceAll(
"#bottombar",
"?");
2101 t.ReplaceAll(
"#notsubset",
"?");
2102 t.ReplaceAll(
"#arcbottom",
"?");
2103 t.ReplaceAll(
"#cbar",
"?");
2104 t.ReplaceAll(
"#arctop",
"?");
2105 t.ReplaceAll(
"#topbar",
"?");
2106 t.ReplaceAll(
"#arcbar",
"?");
2107 t.ReplaceAll(
"#downleftarrow",
"?");
2108 t.ReplaceAll(
"#splitline",
"\\genfrac{}{}{0pt}{}");
2110 t.ReplaceAll(
"#",
"\\");
2111 t.ReplaceAll(
"%",
"\\%");
2121 gPad->SetBatch(saveb);
2136 if( newText.
Length() == 0)
return 0;
2141 std::cout<<
"\n*ERROR<TLatex>: "<<
fError<<std::endl;
2142 std::cout<<
"==> "<<text1<<std::endl;
2151 gPad->PaintText(x,y,text1);
2157 if (strstr(text1,
"\\")) {
2195 x =
gPad->XtoAbsPixel(x);
2196 y =
gPad->YtoAbsPixel(y);
2216 std::cout<<
"*ERROR<TLatex>: "<<
fError<<std::endl;
2217 std::cout<<
"==> "<<text<<std::endl;
2220 newSpec.
fSize = size;
2223 case 0: y -= fs.
Under() ;
break;
2225 case 2: y += fs.
Height()*0.5-fs.
Under(); y++;
break;
2226 case 3: y += fs.
Over() ;
break;
2229 case 2: x -= fs.
Width()/2 ;
break;
2230 case 3: x -= fs.
Width() ;
break;
2232 Analyse(x,y,newSpec,text,length);
2235 gPad->SetBatch(saveb);
2244 if (
fError != 0)
return 0;
2253 const Char_t *kWord1[] = {
"{}^{",
"{}_{",
"^{",
"_{",
"#scale{",
"#color{",
"#font{",
"#sqrt{",
"#[]{",
"#{}{",
"#||{",
2254 "#bar{",
"#vec{",
"#dot{",
"#hat{",
"#ddot{",
"#acute{",
"#grave{",
"#check{",
"#tilde{",
"#slash{",
"#bf{",
"#it{",
"#mbox{",
2255 "\\scale{",
"\\color{",
"\\font{",
"\\sqrt{",
"\\[]{",
"\\{}{",
"\\||{",
"#(){",
"\\(){",
2256 "\\bar{",
"\\vec{",
"\\dot{",
"\\hat{",
"\\ddot{",
"\\acute{",
"\\grave{",
"\\check{",
"\\bf{",
"\\it{",
"\\mbox{"};
2257 const Char_t *kWord2[] = {
"#scale[",
"#color[",
"#font[",
"#sqrt[",
"#kern[",
"#lower[",
"\\scale[",
"\\color[",
"\\font[",
"\\sqrt[",
"\\kern[",
"\\lower["};
2258 const Char_t *kWord3[] = {
"#frac{",
"\\frac{",
"#splitline{",
"\\splitline{"};
2259 const Char_t *kLeft1[] = {
"#left[",
"\\left[",
"#left{",
"\\left{",
"#left|",
"\\left|",
"#left(",
"\\left("};
2260 const Char_t *kLeft2[] = {
"#[]{",
"#[]{",
"#{}{",
"#{}{",
"#||{",
"#||{",
"#(){",
"#(){"};
2261 const Char_t *kRight[] = {
"#right]",
"\\right]",
"#right}",
"\\right}",
"#right|",
"\\right|",
"#right)",
"\\right)"};
2262 const Int_t lkWord1[] = {4,4,2,2,7,7,6,6,4,4,4,5,5,5,5,6,7,7,7,7,7,4,4,6,7,7,6,6,4,4,4,4,4,5,5,5,5,6,7,7,7,4,4,6};
2263 const Int_t lkWord2[] = {7,7,6,6,6,7,7,7,6,6,6,7} ;
2264 const Int_t lkWord3[] = {6,6,11,11} ;
2265 Int_t nkWord1 = 44, nkWord2 = 12, nkWord3 = 4;
2267 Int_t nLeft1 , nRight , nOfLeft, nOfRight;
2271 nLeft1 = nRight = 8 ;
2272 nOfLeft = nOfRight = 0 ;
2274 Char_t buf[11] ;
for (i=0;i<11;i++) buf[i]=0;
2279 Int_t nOfCurlyBracket, nOfKW1, nOfKW2, nOfKW3, nOfSquareCurly, nOfCurlyCurly ;
2280 Int_t nOfExtraCurly = 0 , nOfExtraSquare = 0;
2281 Int_t nOfSquareBracket = 0 ;
2288 while (i < length) {
2291 strncpy(buf,&text[i],
TMath::Min(7,length-i));
2293 for (k = 0 ; k < nLeft1 ; k++) {
2294 if (strncmp(buf,kLeft1[k],lLeft1)==0) {
2301 if (opFound) continue ;
2303 for(k=0;k<nRight;k++) {
2304 if (strncmp(buf,kRight[k],lRight)==0) {
2313 if (nOfLeft != nOfRight) {
2314 printf(
" nOfLeft = %d, nOfRight = %d\n",nOfLeft,nOfRight) ;
2316 fError =
"Operators \"#left\" and \"#right\" don't match !" ;
2320 for (k = 0 ; k < nLeft1 ; k++) {
2321 text.
ReplaceAll(kLeft1[k],lLeft1,kLeft2[k],lLeft2) ;
2323 for (k = 0 ; k < nRight ; k++) {
2328 i = nOfCurlyBracket = nOfKW1 = nOfKW2 = nOfKW3 = nOfSquareCurly = nOfCurlyCurly =0 ;
2331 case '"' : quote1 = !quote1 ; break ;
2332 case '\'': quote2 = !quote2 ; break ;
2336 strncpy(buf,&text[i],
TMath::Min(11,length-i));
2339 for(k=0;k<nkWord1;k++) {
2340 if (strncmp(buf,kWord1[k],lkWord1[k])==0) {
2348 if (opFound) continue ;
2350 for(k=0;k<nkWord2;k++) {
2351 if (strncmp(buf,kWord2[k],lkWord2[k])==0) {
2359 if (opFound) continue ;
2361 for(k=0;k<nkWord3;k++) {
2362 if (strncmp(buf,kWord3[k],lkWord3[k])==0) {
2371 if (opFound) continue ;
2372 if (strncmp(buf,
"}{",2) == 0 && opFrac) {
2377 else if (strncmp(buf,
"]{",2) == 0 && nOfSquareBracket) {
2381 nOfSquareBracket-- ;
2383 else if (strncmp(buf,
"@{",2) == 0 || strncmp(buf,
"@}",2) == 0) {
2386 else if (strncmp(buf,
"@[",2) == 0 || strncmp(buf,
"@]",2) == 0) {
2389 else if (text[i] ==
']' ) {
2395 else if (text[i] ==
'[' ) {
2401 else if (text[i] ==
'{' ) {
2407 else if (text[i] ==
'}' ) {
2408 if ( nOfCurlyBracket) {
2423 if (nOfKW2 != nOfSquareCurly) {
2425 fError =
"Invalid number of \"]{\"" ;
2427 else if (nOfKW3 != nOfCurlyCurly) {
2429 fError =
"Error in syntax of \"#frac\"" ;
2431 else if (nOfCurlyBracket < 0) {
2433 fError =
"Missing \"{\"" ;
2435 else if (nOfCurlyBracket > 0) {
2437 fError =
"Missing \"}\"" ;
2439 else if (nOfSquareBracket < 0) {
2441 fError =
"Missing \"[\"" ;
2443 else if (nOfSquareBracket > 0) {
2445 fError =
"Missing \"]\"" ;
2475 spec.
fSize = size/hw;
2516 if( newText.
Length() == 0)
return 0;
2526 std::cout<<
"\n*ERROR<TLatex>: "<<
fError<<std::endl;
2527 std::cout<<
"==> "<<
GetTitle()<<std::endl;
2547 if( newText.
Length() == 0)
return;
2558 std::cout<<
"\n*ERROR<TLatex>: "<<
fError<<std::endl;
2559 std::cout<<
"==> "<<
GetTitle()<<std::endl;
2565 Int_t cBoxX[4], cBoxY[4];
2568 ptx =
gPad->UtoPixel(
fX);
2569 pty =
gPad->VtoPixel(
fY);
2575 Int_t x1 = cBoxX[0];
2576 Int_t x2 = cBoxX[0];
2577 Int_t y1 = cBoxY[0];
2578 Int_t y2 = cBoxY[0];
2579 for (
Int_t i=1; i<4; i++) {
2580 if (cBoxX[i] < x1) x1 = cBoxX[i];
2581 if (cBoxX[i] > x2) x2 = cBoxX[i];
2582 if (cBoxY[i] < y1) y1 = cBoxY[i];
2583 if (cBoxY[i] > y2) y2 = cBoxY[i];
2603 if( newText.
Length() == 0)
return 0;
2613 std::cout<<
"\n*ERROR<TLatex>: "<<
fError<<std::endl;
2614 std::cout<<
"==> "<<
GetTitle()<<std::endl;
2676 out<<
" tex = new TLatex("<<
fX<<
","<<
fY<<
","<<quote<<s.
Data()<<quote<<
");"<<std::endl;
2682 out<<
" tex->Draw();"<<std::endl;
virtual void SetLineWidth(Width_t lwidth)
Set the line width.
Int_t fLimitFactorSize
lower bound for subscripts/superscripts size
Bool_t fShow
! is true during the second pass (Painting)
virtual void PaintMathText(Double_t x, Double_t y, Double_t angle, Double_t size, const char *text)
Paint text (used by Paint()).
virtual void GetTextAscentDescent(UInt_t &a, UInt_t &d, const char *text) const
Return text ascent and descent for string text.
Double_t fOriginSize
Font size of the starting font.
virtual Color_t GetTextColor() const
Return the text color.
virtual Short_t GetTextAlign() const
Return the text alignment.
TString & ReplaceAll(const TString &s1, const TString &s2)
void Copy(TObject &text) const
Copy this text to text.
virtual Float_t GetTextAngle() const
Return the text angle.
R__ALWAYS_INLINE Bool_t TestBit(UInt_t f) const
virtual void GetControlBox(Int_t x, Int_t y, Double_t theta, Int_t cBoxX[4], Int_t cBoxY[4])
Return the text control box.
Int_t fTabMax
! Maximum allocation for array fTabSize;
Short_t Min(Short_t a, Short_t b)
void GetBoundingBox(UInt_t &w, UInt_t &h, Bool_t angle=kFALSE)
Get the text width and height.
virtual void Modify()
Change current line attributes if necessary.
TLatex & operator=(const TLatex &)
assignment operator
TString & Insert(Ssiz_t pos, const char *s)
virtual Width_t GetLineWidth() const
Return the line width.
void SetBit(UInt_t f, Bool_t set)
Set or unset the user status bits as specified in f.
if object in a list can be deleted
Int_t PaintLatex1(Double_t x, Double_t y, Double_t angle, Double_t size, const char *text)
Drawing function.
virtual void AppendPad(Option_t *option="")
Append graphics object to current pad.
virtual void Modify()
Change current text attributes if necessary.
TLatex * DrawLatexNDC(Double_t x, Double_t y, const char *text)
Draw this TLatex with new coordinates in NDC.
virtual void SetTextFont(Font_t tfont=62)
Set the text font.
static const double x2[5]
void DrawLine(Double_t x1, Double_t y1, Double_t x2, Double_t y2, TextSpec_t spec)
Draw a line in a Latex formula.
Double_t GetYsize()
Return size of the formula along Y in pad coordinates.
void DrawCircle(Double_t x1, Double_t y1, Double_t r, TextSpec_t spec)
Draw an arc of ellipse in a Latex formula (right or left parenthesis)
void Copy(TAttLine &attline) const
Copy this line attributes to a new TAttLine.
virtual void SaveLineAttributes(std::ostream &out, const char *name, Int_t coldef=1, Int_t stydef=1, Int_t widdef=1)
Save line attributes as C++ statement(s) on output stream out.
virtual Float_t GetTextSize() const
Return the text size.
TLatexFormSize Anal1(TextSpec_t spec, const Char_t *t, Int_t length)
Analyse function.
To draw Mathematical Formula.
virtual void Paint(Option_t *option="")
Paint.
static const double x4[22]
TLatex * DrawLatex(Double_t x, Double_t y, const char *text)
Make a copy of this object with the new parameters And copy object attributes.
Base class for several text objects.
TLatex()
Default constructor.
virtual void SetNDC(Bool_t isNDC=kTRUE)
Set NDC mode on if isNDC = kTRUE, off otherwise.
Int_t CheckLatexSyntax(TString &text)
Check if the Latex syntax is correct.
virtual void PaintLatex(Double_t x, Double_t y, Double_t angle, Double_t size, const char *text)
Main drawing function.
virtual void Text(Double_t x, Double_t y, const char *string)=0
void DrawParenthesis(Double_t x1, Double_t y1, Double_t r1, Double_t r2, Double_t phimin, Double_t phimax, TextSpec_t spec)
Draw an arc of ellipse in a Latex formula (right or left parenthesis)
virtual void SetTextAlign(Short_t align=11)
Set the text alignment.
const Char_t * fError
! error code
void Copy(TAttText &atttext) const
Copy this text attributes to a new TAttText.
virtual void SetLineColor(Color_t lcolor)
Set the line color.
Float_t fTextAngle
Text angle.
Double_t GetHeight() const
Return height of current pad in pixels.
virtual void SavePrimitive(std::ostream &out, Option_t *option="")
Save primitive as a C++ statement(s) on output stream out.
TNamed & operator=(const TNamed &rhs)
TNamed assignment operator.
Double_t GetXsize()
Return size of the formula along X in pad coordinates.
TLatexFormSize Readfs()
Read fs in fTabSize.
virtual void SaveTextAttributes(std::ostream &out, const char *name, Int_t alidef=12, Float_t angdef=0, Int_t coldef=1, Int_t fondef=61, Float_t sizdef=1)
Save text attributes as C++ statement(s) on output stream out.
virtual Font_t GetTextFont() const
Return the text font.
virtual Bool_t InheritsFrom(const char *classname) const
Returns kTRUE if object inherits from class "classname".
virtual void SetTextAngle(Float_t tangle=0)
Set the text angle.
Double_t fY
Y position of text (left,center,etc..)
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
TLatexFormSize Analyse(Double_t x, Double_t y, TextSpec_t spec, const Char_t *t, Int_t length)
Analyse and paint the TLatex formula.
void GetBoundingBox(UInt_t &w, UInt_t &h, Bool_t angle=kFALSE)
Return text size in pixels.
Font_t fTextFont
Text font.
TLatexFormSize FirstParse(Double_t angle, Double_t size, const Char_t *text)
First parsing of the analyse sequence.
void Savefs(TLatexFormSize *fs)
Save fs values in array fTabSize.
FormSize_t * fTabSize
! array of values for the different zones
The text postion is in NDC coordinates.
virtual Color_t GetLineColor() const
Return the line color.
virtual ~TLatex()
Destructor.
static const double x1[5]
Int_t fPos
! Current position in array fTabSize;
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
static constexpr double s
To draw TeX Mathematical Formula.
void Copy(TObject &text) const
Copy this TLatex object to another TLatex.
Double_t fFactorPos
! Relative position of subscripts and superscripts
virtual void GetTextExtent(UInt_t &w, UInt_t &h, const char *text) const
Return text extent for string text.
Binding & operator=(OUT(*fun)(void))
Mother of all ROOT objects.
TLatex helper struct holding the attributes of a piece of text.
Short_t Max(Short_t a, Short_t b)
Bool_t fItalic
! Currently inside italic operator
R__EXTERN TVirtualPS * gVirtualPS
virtual void SetLimitIndiceSize(Int_t limitFactorSize)
Set limit for text resizing of subscripts and superscripts.
virtual void SetTextColor(Color_t tcolor=1)
Set the text color.
TVirtualPS is an abstract interface to Postscript, PDF, SVG.
virtual void SetTextSize(Float_t tsize=1)
Set the text size.
virtual void PaintText(Double_t x, Double_t y, const char *text)
Draw this text with new coordinates.
Double_t GetYsize(void)
Get Y size.
Double_t GetXsize(void)
Get X size.
Double_t fFactorSize
! Relative size of subscripts and superscripts
virtual const char * GetTitle() const
Returns title of object.
Double_t fX
X position of text (left,center,etc..)
virtual void SetIndiceSize(Double_t factorSize)
Set relative size of subscripts and superscripts.
Short_t fTextAlign
Text alignment.
static const double x3[11]
const char * Data() const