468 TAttLine::operator=(lt);
493 ((
TLatex&)obj).fTabSize = 0;
507 return Analyse(0,0,spec,t,length);
539 const char *tab[] = {
"alpha",
"beta",
"chi",
"delta",
"varepsilon",
"phi",
"gamma",
"eta",
"iota",
"varphi",
"kappa",
"lambda",
540 "mu",
"nu",
"omicron",
"pi",
"theta",
"rho",
"sigma",
"tau",
"upsilon",
"varomega",
"omega",
"xi",
"psi",
"zeta",
541 "Alpha",
"Beta",
"Chi",
"Delta",
"Epsilon",
"Phi",
"Gamma",
"Eta",
"Iota",
"vartheta",
542 "Kappa",
"Lambda",
"Mu",
"Nu",
"Omicron",
"Pi",
"Theta",
"Rho",
"Sigma",
"Tau",
543 "Upsilon",
"varsigma",
"Omega",
"Xi",
"Psi",
"Zeta",
"varUpsilon",
"epsilon"};
545 const char *
tab2[] = {
"leq",
"/",
"infty",
"voidb",
"club",
"diamond",
"heart",
546 "spade",
"leftrightarrow",
"leftarrow",
"uparrow",
"rightarrow",
547 "downarrow",
"circ",
"pm",
"doublequote",
"geq",
"times",
"propto",
548 "partial",
"bullet",
"divide",
"neq",
"equiv",
"approx",
"3dots",
549 "cbar",
"topbar",
"downleftarrow",
"aleph",
"Jgothic",
"Rgothic",
"voidn",
550 "otimes",
"oplus",
"oslash",
"cap",
"cup",
"supset",
"supseteq",
551 "notsubset",
"subset",
"subseteq",
"in",
"notin",
"angle",
"nabla",
552 "oright",
"ocopyright",
"trademark",
"prod",
"surd",
"upoint",
"corner",
"wedge",
553 "vee",
"Leftrightarrow",
"Leftarrow",
"Uparrow",
"Rightarrow",
554 "Downarrow",
"diamond",
"LT",
"void1",
"copyright",
"void3",
"sum",
555 "arctop",
"lbar",
"arcbottom",
"topbar",
"void8",
"bottombar",
"arcbar",
556 "ltbar",
"AA",
"aa",
"void06",
"GT",
"int",
"forall",
"exists" };
558 const char *
tab3[] = {
"bar",
"vec",
"dot",
"hat",
"ddot",
"acute",
"grave",
"check",
"tilde",
"slash"};
562 Int_t nBlancDeb=0,nBlancFin=0,l_nBlancDeb=0,l_nBlancFin=0;
575 if (nBlancDeb==l_nBlancDeb && nBlancFin==l_nBlancFin) cont =
kFALSE;
578 if (t[nBlancDeb]==
'{' && t[length-nBlancFin-1]==
'}') {
581 for(i=nBlancDeb;i<length-nBlancFin;i++) {
582 if (t[i] ==
'{' && !(i>0 && t[i-1] ==
'@')) nBrackets++;
583 if (t[i] ==
'}' && t[i-1]!=
'@') nBrackets--;
584 if (nBrackets==0 && i<length-nBlancFin-2) {
600 l_nBlancDeb = nBlancDeb;
601 l_nBlancFin = nBlancFin;
606 length -= nBlancFin+nBlancDeb;
608 Error(
"Analyse",
"It seems there is a syntax error in the TLatex string");
612 strncpy(
text,t+nBlancDeb,length);
618 indiceSize = spec.
fSize;
621 specNewSize.
fSize = indiceSize;
630 Int_t opCurlyCurly = -1;
631 Int_t opSquareCurly = -1;
632 Int_t opCloseCurly = -2;
639 Int_t opSquareBracket = 0 ;
640 Int_t opBigCurly = 0 ;
643 Int_t abovePlace = 0 ;
651 Int_t opBackslash = 0;
652 Int_t opParallel = 0;
653 Int_t opSplitLine = -1;
663 for(i=0;i<length;i++) {
665 case '\'' : quote1 = !quote1 ; break ;
666 case '"' : quote2 = !quote2 ; break ;
672 if (!(i>0 &&
text[i-1] ==
'@')) nBrackets++;
677 if (!(i>0 &&
text[i-1] ==
'@')) nBrackets--;
679 if (i<length-1)
if (
text[i+1]==
'{' && opCurlyCurly==-1) opCurlyCurly=i;
681 if (
text[i+1]!=
'{' && !(
text[i+2]==
'{' && (
text[i+1]==
'^' ||
text[i+1]==
'_'))
682 && opCloseCurly==-2) opCloseCurly=i;
684 else if (i<length-1) {
685 if (
text[i+1]!=
'{' && opCloseCurly==-2) opCloseCurly=i;
687 else if (opCloseCurly==-2) opCloseCurly=i;
693 if (!(i>0 &&
text[i-1] ==
'@')) nCroch++;
698 if (!(i>0 &&
text[i-1] ==
'@')) nCroch--;
710 strncpy(buf,&
text[i],2);
711 if (strncmp(buf,
"^{",2)==0) {
712 if (opPower==-1 && nBrackets==0 && nCroch==0) opPower=i;
715 strncpy(buf1,&
text[i-4],4);
716 if (strncmp(buf1,
"#int",4)==0) {
718 if (i>4 && opCloseCurly==-2) opCloseCurly=i-5;
720 if (strncmp(buf1,
"#sum",4)==0) {
722 if (i>4 && opCloseCurly==-2) opCloseCurly=i-5;
726 if (strncmp(buf,
"_{",2)==0) {
727 if (opUnder==-1 && nBrackets==0 && nCroch==0) opUnder=i;
730 strncpy(buf2,&
text[i-4],4);
731 if (strncmp(buf2,
"#int",4)==0) {
733 if (i>4 && opCloseCurly==-2) opCloseCurly=i-5;
735 if (strncmp(buf2,
"#sum",4)==0) {
737 if (i>4 && opCloseCurly==-2) opCloseCurly=i-5;
741 if (strncmp(buf,
"]{",2)==0)
742 if (opSquareCurly==-1 && nBrackets==0 && nCroch==0) opSquareCurly=i;
745 if (
text[i]==
'\\' || (
text[i]==
'#' && !opFound && nBrackets==0 && nCroch==0)) {
749 strncpy(buf,&
text[i+1],10);
750 if (strncmp(buf,
"splitline{",10)==0) {
751 opSplitLine=i; opFound =
kTRUE;
752 if (i>0 && opCloseCurly==-2) opCloseCurly=i-1;
758 strncpy(buf,&
text[i+1],9);
759 if (!opBackslash && strncmp(buf,
"backslash",9)==0) {
760 opBackslash=1; opFound =
kTRUE;
761 if (i>0 && opCloseCurly==-2) opCloseCurly=i-1;
767 strncpy(buf,&
text[i+1],8);
768 if (!opParallel && strncmp(buf,
"parallel",8)==0) {
769 opParallel=1; opFound =
kTRUE;
770 if (i>0 && opCloseCurly==-2) opCloseCurly=i-1;
776 strncpy(buf,&
text[i+1],6);
777 if (strncmp(buf,
"lower[",6)==0 || strncmp(buf,
"lower{",6)==0) {
778 opLower=i; opFound =
kTRUE;
779 if (i>0 && opCloseCurly==-2) opCloseCurly=i-1;
782 if (strncmp(buf,
"scale[",6)==0 || strncmp(buf,
"scale{",6)==0) {
783 opScale=i; opFound =
kTRUE;
784 if (i>0 && opCloseCurly==-2) opCloseCurly=i-1;
787 if (strncmp(buf,
"color[",6)==0 || strncmp(buf,
"color{",6)==0) {
788 opColor=i; opFound =
kTRUE;
789 if (i>0 && opCloseCurly==-2) opCloseCurly=i-1;
795 strncpy(buf,&
text[i+1],5);
796 if (strncmp(buf,
"frac{",5)==0) {
797 opFrac=i; opFound =
kTRUE;
798 if (i>0 && opCloseCurly==-2) opCloseCurly=i-1;
801 if (strncmp(buf,
"sqrt{",5)==0 || strncmp(buf,
"sqrt[",5)==0) {
802 opSqrt=i; opFound =
kTRUE;
803 if (i>0 && opCloseCurly==-2) opCloseCurly=i-1;
806 if (strncmp(buf,
"font{",5)==0 || strncmp(buf,
"font[",5)==0) {
807 opFont=i; opFound =
kTRUE;
808 if (i>0 && opCloseCurly==-2) opCloseCurly=i-1;
811 if (strncmp(buf,
"kern[",5)==0 || strncmp(buf,
"kern{",5)==0) {
812 opKern=i; opFound =
kTRUE;
813 if (i>0 && opCloseCurly==-2) opCloseCurly=i-1;
816 if (!opMinus && strncmp(buf,
"minus",5)==0) {
817 opMinus=1; opFound =
kTRUE;
818 if (i>0 && opCloseCurly==-2) opCloseCurly=i-1;
821 if (strncmp(buf,
"mbox[",5)==0 || strncmp(buf,
"mbox{",5)==0) {
822 opMbox=i; opFound =
kTRUE;
823 if (i>0 && opCloseCurly==-2) opCloseCurly=i-1;
829 strncpy(buf,&
text[i+1],4);
830 if (!opOdot && strncmp(buf,
"odot",4)==0) {
831 opOdot=1; opFound =
kTRUE;
832 if (i>0 && opCloseCurly==-2) opCloseCurly=i-1;
835 if (!opHbar && strncmp(buf,
"hbar",4)==0) {
836 opHbar=1; opFound =
kTRUE;
837 if (i>0 && opCloseCurly==-2) opCloseCurly=i-1;
840 if (!opPerp && strncmp(buf,
"perp",4)==0) {
841 opPerp=1; opFound =
kTRUE;
842 if (i>0 && opCloseCurly==-2) opCloseCurly=i-1;
845 if (!opPlus && strncmp(buf,
"plus",4)==0) {
846 opPlus=1; opFound =
kTRUE;
847 if (i>0 && opCloseCurly==-2) opCloseCurly=i-1;
853 strncpy(buf,&
text[i+1],3);
855 if (strncmp(buf,
"[]{",3)==0) {
856 opSquareBracket=1; opFound =
kTRUE;
857 if (i>0 && opCloseCurly==-2) opCloseCurly=i-1;
860 if (strncmp(buf,
"{}{",3)==0 ) {
861 opBigCurly=1; opFound =
kTRUE;
862 if (i>0 && opCloseCurly==-2) opCloseCurly=i-1;
865 if (strncmp(buf,
"||{",3)==0) {
866 opAbs=1; opFound =
kTRUE;
867 if (i>0 && opCloseCurly==-2) opCloseCurly=i-1;
870 if (strncmp(buf,
"(){",3)==0) {
871 opParen=1; opFound =
kTRUE;
872 if (i>0 && opCloseCurly==-2) opCloseCurly=i-1;
875 if (!opBox && strncmp(buf,
"Box",3)==0) {
876 opBox=1; opFound =
kTRUE;
877 if (i>0 && opCloseCurly==-2) opCloseCurly=i-1;
880 if (strncmp(buf,
"bf[",3)==0 || strncmp(buf,
"bf{",3)==0) {
881 opBf=i; opFound =
kTRUE;
882 if (i>0 && opCloseCurly==-2) opCloseCurly=i-1;
885 if (strncmp(buf,
"it[",3)==0 || strncmp(buf,
"it{",3)==0) {
886 opIt=i; opFound =
kTRUE;
887 if (i>0 && opCloseCurly==-2) opCloseCurly=i-1;
893 strncpy(buf,&
text[i+1],2);
894 if (!opMp && strncmp(buf,
"mp",2)==0) {
895 opMp=1; opFound =
kTRUE;
896 if (i>0 && opCloseCurly==-2) opCloseCurly=i-1;
901 if (!opFound &&
UInt_t(length)>i+strlen(tab[k])) {
902 if (strncmp(&
text[i+1],tab[k],strlen(tab[k]))==0) {
905 if (i>0 && opCloseCurly==-2) opCloseCurly=i-1;
910 if (!opFound &&
UInt_t(length)>i+strlen(
tab3[k])) {
914 if (i>0 && opCloseCurly==-2) opCloseCurly=i-1;
921 if ((opSpec==-1 || strlen(
tab2[k])>lastsize) &&
UInt_t(length)>i+strlen(
tab2[k])) {
923 lastsize = strlen(
tab2[k]);
926 if (i>0 && opCloseCurly==-2) opCloseCurly=i-1;
939 if (opCloseCurly>-1 && opCloseCurly<length-1) {
942 fs2 =
Anal1(spec,
text+opCloseCurly+1,length-opCloseCurly-1);
952 else if (opPower>-1 && opUnder>-1) {
957 switch (abovePlace) {
959 prop = .8 ; propU = 1.75 ;
962 prop = .9 ; propU = 1.75 ;
971 if (min >= 2 && strncmp(&
text[min-2],
"{}",2)==0) {
978 fs2 =
Anal1(specNewSize,
text+min+1,max-min-1);
979 fs3 =
Anal1(specNewSize,
text+max+1,length-max-1);
990 if (opPower<opUnder) {
1000 Double_t addW1, addW2, addH1, addH2;
1003 if (opPower<opUnder) {
1005 addW1 = (
m-fs2.
Width())/2;
1007 addW2 = (
m-fs3.
Width())/2;
1010 addW1 = (
m-fs2.
Width())/2;
1012 addW2 = (
m-fs3.
Width())/2;
1015 Analyse(
x+addW2,
y+addH2,specNewSize,
text+max+1,length-max-1);
1019 if (min >= 2 && strncmp(&
text[min-2],
"{}",2)==0) {
1028 if (opPower<opUnder) {
1038 if (opPower<opUnder) {
1047 else if (opPower>-1) {
1050 switch (abovePlace) {
1052 prop = 1.75 ; break ;
1054 prop = 1.75; break ;
1058 Int_t ltext = opPower ;
1059 if (ltext >= 2 && strncmp(&
text[ltext-2],
"{}",2)==0) {
1066 fs2 =
Anal1(specNewSize,
text+opPower+1,length-opPower-1);
1075 if (over <= 0) over = 1.5*fs2.
Over();
1086 if (opPower >= 2 && strncmp(&
text[opPower-2],
"{}",2)==0) {
1101 else if (opUnder>-1) {
1107 Int_t ltext = opUnder ;
1108 if (ltext >= 2 && strncmp(&
text[ltext-2],
"{}",2)==0) {
1115 fs2 =
Anal1(specNewSize,
text+opUnder+1,length-opUnder-1);
1133 if (opUnder >= 2 && strncmp(&
text[opUnder-2],
"{}",2)==0) {
1279 else if (opBackslash) {
1300 else if (opParallel) {
1315 else if (opGreek>-1) {
1318 char letter = 97 + opGreek;
1320 if (opGreek>25) letter -= 58;
1321 if (opGreek == 52) letter =
'\241';
1322 if (opGreek == 53) letter =
'\316';
1324 fs1 =
Anal1(newSpec,&letter,1);
1325 fs2 =
Anal1(spec,
text+strlen(tab[opGreek])+1,length-strlen(tab[opGreek])-1);
1329 Analyse(
x+fs1.
Width(),
y,spec,
text+strlen(tab[opGreek])+1,length-strlen(tab[opGreek])-1);
1336 else if (opSpec>-1) {
1339 char letter =
'\243' + opSpec;
1340 if(opSpec == 75 || opSpec == 76) {
1342 if (
gVirtualX->InheritsFrom(
"TGCocoa")) {
1343 if (opSpec == 75) letter =
'\201';
1344 if (opSpec == 76) letter =
'\214';
1346 if (opSpec == 75) letter =
'\305';
1347 if (opSpec == 76) letter =
'\345';
1350 if(opSpec == 80 || opSpec == 81) {
1351 if (opSpec == 80) letter =
'\042';
1352 if (opSpec == 81) letter =
'\044';
1360 }
else if (opSpec==79) {
1364 fs1 =
Anal1(newSpec,&letter,1);
1365 if (opSpec == 79 || opSpec == 66)
1373 if (opSpec!=66 && opSpec!=79)
1381 else if (opAbove>-1) {
1393 ypos =
y-fs1.
Over()-sub ;
1398 y0 =
y-sub-fs1.
Over() ;
1408 y1 =
y-sub-fs1.
Over() ;
1425 y1 =
y-sub-fs1.
Over() ;
1431 y1 =
y +sub -fs1.
Over() ;
1438 y1 =
y-sub-fs1.
Over() ;
1447 y1 =
y-sub-fs1.
Over() ;
1453 y2 =
y -fs1.
Over() ;
1460 if (
gVirtualX->InheritsFrom(
"TGCocoa")) y2 -= 4.7*sub;
1477 xx =
gPad->AbsPixeltoX(
Int_t((
x2-xOrigin)*cosang+(y22-yOrigin)*sinang+xOrigin));
1478 yy =
gPad->AbsPixeltoY(
Int_t((
x2-xOrigin)*-sinang+(y22-yOrigin)*cosang+yOrigin));
1486 y1 =
y -fs1.
Over() ;
1488 y2 = y1 + 1.2*fs1.
Height();
1494 if (opAbove==1) div=4;
1497 else if (opSquareBracket) {
1517 Double_t radius2,radius1 , dw, l2 =
l/2 ;
1523 radius1 = radius2 * 2 / 3;
1528 radius1 = radius2 * 2 / 3;
1554 else if (opBigCurly) {
1596 else if (opFrac>-1) {
1597 if (opCurlyCurly==-1) {
1599 fError =
"Missing denominator for #frac";
1605 fs1 =
Anal1(spec,
text+opFrac+6,opCurlyCurly-opFrac-6);
1606 fs2 =
Anal1(spec,
text+opCurlyCurly+2,length-opCurlyCurly-3);
1620 Analyse(
x+addW2,
y+fs2.
Over()-height,spec,
text+opCurlyCurly+2,length-opCurlyCurly-3);
1629 else if (opSplitLine>-1) {
1630 if (opCurlyCurly==-1) {
1632 fError =
"Missing second line for #splitline";
1638 fs1 =
Anal1(spec,
text+opSplitLine+11,opCurlyCurly-opSplitLine-11);
1639 fs2 =
Anal1(spec,
text+opCurlyCurly+2,length-opCurlyCurly-3);
1646 Analyse(
x,
y-fs1.
Under()-3*height,spec,
text+opSplitLine+11,opCurlyCurly-opSplitLine-11);
1652 else if (opSqrt>-1) {
1654 if (opSquareCurly>-1) {
1656 fs1 =
Anal1(specNewSize,
text+opSqrt+6,opSquareCurly-opSqrt-6);
1657 fs2 =
Anal1(spec,
text+opSquareCurly+1,length-opSquareCurly-1);
1663 fs1 =
Anal1(spec,
text+opSqrt+5,length-opSqrt-5);
1668 if (opSquareCurly>-1) {
1676 Analyse(
x+pas2,
y,spec,
text+opSquareCurly+1,length-opSquareCurly-1);
1705 else if (opColor>-1) {
1706 if (opSquareCurly==-1) {
1708 fError =
"Missing color number. Syntax is #color[(Int_t)nb]{ ... }";
1714 strncpy(nb,
text+opColor+7,opSquareCurly-opColor-7);
1715 nb[opSquareCurly-opColor-7] = 0;
1716 if (sscanf(nb,
"%d",&newSpec.
fColor) < 1) {
1719 fError =
"Invalid color number. Syntax is #color[(Int_t)nb]{ ... }";
1725 result =
Anal1(newSpec,
text+opSquareCurly+1,length-opSquareCurly-1);
1727 Analyse(
x,
y,newSpec,
text+opSquareCurly+1,length-opSquareCurly-1);
1730 else if (opFont>-1) {
1731 if (opSquareCurly==-1) {
1733 fError =
"Missing font number. Syntax is #font[nb]{ ... }";
1739 strncpy(nb,
text+opFont+6,opSquareCurly-opFont-6);
1740 nb[opSquareCurly-opFont-6] = 0;
1741 if (sscanf(nb,
"%d",&newSpec.
fFont) < 1) {
1744 fError =
"Invalid font number. Syntax is #font[(Int_t)nb]{ ... }";
1750 result =
Anal1(newSpec,
text+opSquareCurly+1,length-opSquareCurly-1);
1752 Analyse(
x,
y,newSpec,
text+opSquareCurly+1,length-opSquareCurly-1);
1755 else if (opKern>-1) {
1756 if (opSquareCurly==-1) {
1758 fError =
"Missing horizontal shift number. Syntax is #kern[dx]{ ... }";
1763 strncpy(dxc,
text+opKern+6,opSquareCurly-opKern-6);
1764 dxc[opSquareCurly-opKern-6] = 0;
1766 if (sscanf(dxc,
"%f",&dx) < 1) {
1769 fError =
"Invalid horizontal shift number. Syntax is #kern[(Float_t)dx]{ ... }";
1775 fs1 =
Anal1(spec,
text+opSquareCurly+1,length-opSquareCurly-1);
1782 Analyse(
x + ddx,
y,spec,
text+opSquareCurly+1,length-opSquareCurly-1);
1785 else if (opLower>-1) {
1786 if (opSquareCurly==-1) {
1788 fError =
"Missing vertical shift number. Syntax is #lower[dy]{ ... }";
1793 strncpy(dyc,
text+opLower+7,opSquareCurly-opLower-7);
1794 dyc[opSquareCurly-opLower-7] = 0;
1796 if (sscanf(dyc,
"%f",&dy) < 1) {
1799 fError =
"Invalid vertical shift number. Syntax is #lower[(Float_t)dy]{ ... }";
1805 fs1 =
Anal1(spec,
text+opSquareCurly+1,length-opSquareCurly-1);
1812 Analyse(
x,
y + ddy,spec,
text+opSquareCurly+1,length-opSquareCurly-1);
1815 else if (opScale>-1) {
1816 if (opSquareCurly==-1) {
1818 fError =
"Missing scale factor. Syntax is #scale[(Double_t)nb]{ ... }";
1824 strncpy(nb,
text+opScale+7,opSquareCurly-opScale-7);
1825 nb[opSquareCurly-opScale-7] = 0;
1826 if (sscanf(nb,
"%lf",&newSpec.
fSize) < 1) {
1829 fError =
"Invalid scale factor. Syntax is #factor[(Double_t)nb]{ ... }";
1836 result =
Anal1(newSpec,
text+opSquareCurly+1,length-opSquareCurly-1);
1838 Analyse(
x,
y,newSpec,
text+opSquareCurly+1,length-opSquareCurly-1);
1843 Int_t lut[] = {3, 13, 1, 6, 7, 4, 5, 10, 11, 8, 9, 12, 2, 14, 15};
1845 if ((fontId >= 1) && (fontId <= (
Int_t)(
sizeof(lut)/
sizeof(lut[0])))) fontId = lut[fontId-1];
1846 newSpec.
fFont = fontId*10 + newSpec.
fFont%10;
1856 else if (opMbox>-1) {
1869 Int_t lut[] = {13, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 15, 1, 14, 12};
1871 if ((fontId >= 1) && (fontId <= (
Int_t)(
sizeof(lut)/
sizeof(lut[0])))) fontId = lut[fontId-1];
1872 newSpec.
fFont = fontId*10 + newSpec.
fFont%10;
1895 quote1 = quote2 =
kFALSE ;
1897 for (i=0 ; i<leng ; i++) {
1899 case '\'' : quote1 = !quote1 ; break ;
1900 case '"' : quote2 = !quote2 ; break ;
1903 if (
text[i] ==
'@') {
1905 if ( *(p+1) ==
'{' || *(p+1) ==
'}' || *(p+1) ==
'[' || *(p+1) ==
']') {
1977 Double_t yy2 =
gPad->AbsPixeltoY(
Int_t((
x2-xOrigin)*-sinang+(y2-yOrigin)*cosang+yOrigin));
1981 gPad->PaintLine(xx,yy,xx2,yy2);
1995 const Int_t np = 40;
2003 for (
Int_t i=0;i<=np;i++) {
2007 x[i] =
gPad->AbsPixeltoX(
Int_t( dx*cosang+ dy*sinang +xOrigin));
2008 y[i] =
gPad->AbsPixeltoY(
Int_t(-dx*sinang+ dy*cosang +yOrigin));
2010 gPad->PaintPolyLine(np+1,
x,
y);
2026 const Int_t np = 40;
2034 for (
Int_t i=0;i<=np;i++) {
2038 x[i] =
gPad->AbsPixeltoX(
Int_t( dx*cosang+dy*sinang +xOrigin));
2039 y[i] =
gPad->AbsPixeltoY(
Int_t(-dx*sinang+dy*cosang +yOrigin));
2041 gPad->PaintPolyLine(np+1,
x,
y);
2070 if (
size<=0 || strlen(text1) <= 0)
return;
2136 t.
ReplaceAll(
"#splitline",
"\\genfrac{}{}{0pt}{}");
2149 gPad->SetBatch(saveb);
2164 if( newText.
Length() == 0)
return 0;
2169 std::cout<<
"\n*ERROR<TLatex>: "<<
fError<<std::endl;
2170 std::cout<<
"==> "<<text1<<std::endl;
2179 gPad->PaintText(
x,
y,text1);
2185 if (strstr(text1,
"\\")) {
2216 x =
gPad->XtoAbsPixel(
x);
2217 y =
gPad->YtoAbsPixel(
y);
2236 std::cout<<
"*ERROR<TLatex>: "<<
fError<<std::endl;
2237 std::cout<<
"==> "<<
text<<std::endl;
2243 case 0:
y -= fs.
Under() ;
break;
2246 case 3:
y += fs.
Over() ;
break;
2249 case 2:
x -= fs.
Width()/2 ;
break;
2250 case 3:
x -= fs.
Width() ;
break;
2255 gPad->SetBatch(saveb);
2264 if (
fError != 0)
return 0;
2273 const Char_t *kWord1[] = {
"{}^{",
"{}_{",
"^{",
"_{",
"#scale{",
"#color{",
"#font{",
"#sqrt{",
"#[]{",
"#{}{",
"#||{",
2274 "#bar{",
"#vec{",
"#dot{",
"#hat{",
"#ddot{",
"#acute{",
"#grave{",
"#check{",
"#tilde{",
"#slash{",
"#bf{",
"#it{",
"#mbox{",
2275 "\\scale{",
"\\color{",
"\\font{",
"\\sqrt{",
"\\[]{",
"\\{}{",
"\\||{",
"#(){",
"\\(){",
2276 "\\bar{",
"\\vec{",
"\\dot{",
"\\hat{",
"\\ddot{",
"\\acute{",
"\\grave{",
"\\check{",
"\\bf{",
"\\it{",
"\\mbox{"};
2277 const Char_t *kWord2[] = {
"#scale[",
"#color[",
"#font[",
"#sqrt[",
"#kern[",
"#lower[",
"\\scale[",
"\\color[",
"\\font[",
"\\sqrt[",
"\\kern[",
"\\lower["};
2278 const Char_t *kWord3[] = {
"#frac{",
"\\frac{",
"#splitline{",
"\\splitline{"};
2279 const Char_t *kLeft1[] = {
"#left[",
"\\left[",
"#left{",
"\\left{",
"#left|",
"\\left|",
"#left(",
"\\left("};
2280 const Char_t *kLeft2[] = {
"#[]{",
"#[]{",
"#{}{",
"#{}{",
"#||{",
"#||{",
"#(){",
"#(){"};
2281 const Char_t *kRight[] = {
"#right]",
"\\right]",
"#right}",
"\\right}",
"#right|",
"\\right|",
"#right)",
"\\right)"};
2282 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};
2283 const Int_t lkWord2[] = {7,7,6,6,6,7,7,7,6,6,6,7} ;
2284 const Int_t lkWord3[] = {6,6,11,11} ;
2285 Int_t nkWord1 = 44, nkWord2 = 12, nkWord3 = 4;
2287 Int_t nLeft1 , nRight , nOfLeft, nOfRight;
2291 nLeft1 = nRight = 8 ;
2292 nOfLeft = nOfRight = 0 ;
2294 Char_t buf[11] ;
for (i=0;i<11;i++) buf[i]=0;
2299 Int_t nOfCurlyBracket, nOfKW1, nOfKW2, nOfKW3, nOfSquareCurly, nOfCurlyCurly ;
2300 Int_t nOfExtraCurly = 0 , nOfExtraSquare = 0;
2301 Int_t nOfSquareBracket = 0 ;
2308 while (i < length) {
2313 for (k = 0 ; k < nLeft1 ; k++) {
2314 if (strncmp(buf,kLeft1[k],lLeft1)==0) {
2321 if (opFound) continue ;
2323 for(k=0;k<nRight;k++) {
2324 if (strncmp(buf,kRight[k],lRight)==0) {
2333 if (nOfLeft != nOfRight) {
2334 printf(
" nOfLeft = %d, nOfRight = %d\n",nOfLeft,nOfRight) ;
2336 fError =
"Operators \"#left\" and \"#right\" don't match !" ;
2340 for (k = 0 ; k < nLeft1 ; k++) {
2341 text.ReplaceAll(kLeft1[k],lLeft1,kLeft2[k],lLeft2) ;
2343 for (k = 0 ; k < nRight ; k++) {
2344 text.ReplaceAll(kRight[k],lRight,
"}",1) ;
2346 length =
text.Length() ;
2348 i = nOfCurlyBracket = nOfKW1 = nOfKW2 = nOfKW3 = nOfSquareCurly = nOfCurlyCurly =0 ;
2351 case '"' : quote1 = !quote1 ; break ;
2352 case '\'': quote2 = !quote2 ; break ;
2359 for(k=0;k<nkWord1;k++) {
2360 if (strncmp(buf,kWord1[k],lkWord1[k])==0) {
2368 if (opFound) continue ;
2370 for(k=0;k<nkWord2;k++) {
2371 if (strncmp(buf,kWord2[k],lkWord2[k])==0) {
2379 if (opFound) continue ;
2381 for(k=0;k<nkWord3;k++) {
2382 if (strncmp(buf,kWord3[k],lkWord3[k])==0) {
2391 if (opFound) continue ;
2392 if (strncmp(buf,
"}{",2) == 0 && opFrac) {
2397 else if (strncmp(buf,
"]{",2) == 0 && nOfSquareBracket) {
2401 nOfSquareBracket-- ;
2403 else if (strncmp(buf,
"@{",2) == 0 || strncmp(buf,
"@}",2) == 0) {
2406 else if (strncmp(buf,
"@[",2) == 0 || strncmp(buf,
"@]",2) == 0) {
2409 else if (
text[i] ==
']' ) {
2410 text.Insert(i,
"@") ;
2415 else if (
text[i] ==
'[' ) {
2416 text.Insert(i,
"@") ;
2421 else if (
text[i] ==
'{' ) {
2422 text.Insert(i,
"@") ;
2427 else if (
text[i] ==
'}' ) {
2428 if ( nOfCurlyBracket) {
2432 text.Insert(i,
"@") ;
2443 if (nOfKW2 != nOfSquareCurly) {
2445 fError =
"Invalid number of \"]{\"" ;
2447 else if (nOfKW3 != nOfCurlyCurly) {
2449 fError =
"Error in syntax of \"#frac\"" ;
2451 else if (nOfCurlyBracket < 0) {
2453 fError =
"Missing \"{\"" ;
2455 else if (nOfCurlyBracket > 0) {
2457 fError =
"Missing \"}\"" ;
2459 else if (nOfSquareBracket < 0) {
2461 fError =
"Missing \"[\"" ;
2463 else if (nOfSquareBracket > 0) {
2465 fError =
"Missing \"]\"" ;
2529 if (!
gPad)
return 0;
2531 if( newText.
Length() == 0)
return 0;
2541 std::cout<<
"\n*ERROR<TLatex>: "<<
fError<<std::endl;
2542 std::cout<<
"==> "<<
GetTitle()<<std::endl;
2562 if( newText.
Length() == 0)
return;
2573 std::cout<<
"\n*ERROR<TLatex>: "<<
fError<<std::endl;
2574 std::cout<<
"==> "<<
GetTitle()<<std::endl;
2580 Int_t cBoxX[4], cBoxY[4];
2583 ptx =
gPad->UtoPixel(
fX);
2584 pty =
gPad->VtoPixel(
fY);
2592 Int_t y1 = cBoxY[0];
2593 Int_t y2 = cBoxY[0];
2594 for (
Int_t i=1; i<4; i++) {
2595 if (cBoxX[i] <
x1)
x1 = cBoxX[i];
2596 if (cBoxX[i] >
x2)
x2 = cBoxX[i];
2597 if (cBoxY[i] < y1) y1 = cBoxY[i];
2598 if (cBoxY[i] > y2) y2 = cBoxY[i];
2617 if (!
gPad)
return 0;
2619 if( newText.
Length() == 0)
return 0;
2629 std::cout<<
"\n*ERROR<TLatex>: "<<
fError<<std::endl;
2630 std::cout<<
"==> "<<
GetTitle()<<std::endl;
2682 if (
gROOT->ClassSaved(TLatex::Class())) {
2692 out<<
" tex = new TLatex("<<
fX<<
","<<
fY<<
","<<quote<<s.
Data()<<quote<<
");"<<std::endl;
2698 out<<
" tex->Draw();"<<std::endl;
static const double x2[5]
static const double x4[22]
static const double x1[5]
static const double x3[11]
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
include TDocParser_001 C image html pict1_TDocParser_001 png width
R__EXTERN TVirtualPS * gVirtualPS
virtual Color_t GetLineColor() const
Return the line color.
virtual Width_t GetLineWidth() const
Return the line width.
virtual void SetLineWidth(Width_t lwidth)
Set the line width.
virtual void SetLineColor(Color_t lcolor)
Set the line color.
virtual void Modify()
Change current line attributes if necessary.
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.
virtual void Modify()
Change current text attributes if necessary.
virtual void SetTextAlign(Short_t align=11)
Set the text alignment.
virtual Short_t GetTextAlign() const
Return the text alignment.
virtual Font_t GetTextFont() const
Return the text font.
Float_t fTextAngle
Text angle.
virtual Color_t GetTextColor() const
Return the text color.
virtual void SetTextAngle(Float_t tangle=0)
Set the text angle.
virtual Float_t GetTextAngle() const
Return the text angle.
virtual void SetTextColor(Color_t tcolor=1)
Set the text color.
virtual void SetTextFont(Font_t tfont=62)
Set the text font.
Font_t fTextFont
Text font.
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 void SetTextSize(Float_t tsize=1)
Set the text size.
virtual Float_t GetTextSizePercent(Float_t size)
Return the text in percent of the pad size.
Short_t fTextAlign
Text alignment.
void Copy(TAttText &atttext) const
Copy this text attributes to a new TAttText.
To draw Mathematical Formula.
virtual void SetLimitIndiceSize(Int_t limitFactorSize)
Set limit for text resizing of subscripts and superscripts.
Int_t fPos
! Current position in array fTabSize;
Double_t GetXsize()
Return size of the formula along X in pad coordinates when the text precision is smaller than 3.
Double_t GetHeight() const
Return height of current pad in pixels.
Double_t fFactorPos
! Relative position of subscripts and superscripts
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)
Int_t fLimitFactorSize
lower bound for subscripts/superscripts size
virtual void SetIndiceSize(Double_t factorSize)
Set relative size of subscripts and superscripts.
FormSize_t * fTabSize
! array of values for the different zones
Int_t PaintLatex1(Double_t x, Double_t y, Double_t angle, Double_t size, const char *text)
Drawing function.
Double_t fOriginSize
Font size of the starting font.
Double_t GetYsize()
Return size of the formula along Y in pad coordinates when the text precision is smaller than 3.
TLatexFormSize Anal1(TextSpec_t spec, const Char_t *t, Int_t length)
Analyse function.
Int_t fTabMax
! Maximum allocation for array fTabSize;
TLatexFormSize FirstParse(Double_t angle, Double_t size, const Char_t *text)
First parsing of the analyse sequence.
virtual void SavePrimitive(std::ostream &out, Option_t *option="")
Save primitive as a C++ statement(s) on output stream out.
TLatexFormSize Readfs()
Read fs in fTabSize.
void Copy(TObject &text) const
Copy this TLatex object to another TLatex.
TLatex * DrawLatexNDC(Double_t x, Double_t y, const char *text)
Draw this TLatex with new coordinates in NDC.
void GetBoundingBox(UInt_t &w, UInt_t &h, Bool_t angle=kFALSE)
Return text size in pixels.
virtual ~TLatex()
Destructor.
virtual void PaintLatex(Double_t x, Double_t y, Double_t angle, Double_t size, const char *text)
Main drawing function.
TLatex()
Default constructor.
Bool_t fShow
! is true during the second pass (Painting)
TLatex & operator=(const TLatex &)
assignment operator
void DrawLine(Double_t x1, Double_t y1, Double_t x2, Double_t y2, TextSpec_t spec)
Draw a line in a Latex formula.
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.
Double_t fFactorSize
! Relative size of subscripts and superscripts
const Char_t * fError
! error code
Bool_t fItalic
! Currently inside italic operator
virtual void Paint(Option_t *option="")
Paint.
TLatexFormSize Analyse(Double_t x, Double_t y, TextSpec_t spec, const Char_t *t, Int_t length)
Analyse and paint the TLatex formula.
Int_t CheckLatexSyntax(TString &text)
Check if the Latex syntax is correct.
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)
void Savefs(TLatexFormSize *fs)
Save fs values in array fTabSize.
@ kTextNDC
The text postion is in NDC coordinates.
To draw TeX Mathematical Formula.
Double_t GetYsize(void)
Get Y size.
Double_t GetXsize(void)
Get X size.
void GetBoundingBox(UInt_t &w, UInt_t &h, Bool_t angle=kFALSE)
Get the text width and height.
virtual void PaintMathText(Double_t x, Double_t y, Double_t angle, Double_t size, const char *text)
Paint text (used by Paint()).
virtual const char * GetTitle() const
Returns title of object.
Mother of all ROOT objects.
R__ALWAYS_INLINE Bool_t TestBit(UInt_t f) const
virtual void AppendPad(Option_t *option="")
Append graphics object to current pad.
void SetBit(UInt_t f, Bool_t set)
Set or unset the user status bits as specified in f.
virtual Bool_t InheritsFrom(const char *classname) const
Returns kTRUE if object inherits from class "classname".
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
@ kCanDelete
if object in a list can be deleted
const char * Data() const
TString & ReplaceAll(const TString &s1, const TString &s2)
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
Ssiz_t Index(const char *pat, Ssiz_t i=0, ECaseCompare cmp=kExact) const
Base class for several text objects.
Double_t fY
Y position of text (left,center,etc..)
TText & operator=(const TText &src)
Assignment operator.
Double_t fX
X position of text (left,center,etc..)
void Copy(TObject &text) const
Copy this text to text.
virtual void PaintText(Double_t x, Double_t y, const char *text)
Draw this text with new coordinates.
virtual void GetTextExtent(UInt_t &w, UInt_t &h, const char *text) const
Return text extent for string text.
virtual void GetTextAscentDescent(UInt_t &a, UInt_t &d, const char *text) const
Return text ascent and descent for string text.
virtual void SetNDC(Bool_t isNDC=kTRUE)
Set NDC mode on if isNDC = kTRUE, off otherwise.
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.
TVirtualPS is an abstract interface to Postscript, PDF, SVG.
virtual void Text(Double_t x, Double_t y, const char *string)=0
Short_t Max(Short_t a, Short_t b)
Short_t Min(Short_t a, Short_t b)
TLatex helper struct holding the attributes of a piece of text.