The R Project SVN R

Rev

Rev 3244 | Rev 3786 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3244 Rev 3475
Line 1... Line 1...
1
/*
1
/*
2
 *  R : A Computer Language for Statistical Data Analysis
2
 *  R : A Computer Language for Statistical Data Analysis
3
 *  Copyright (C) 1995, 1996, 1997 Robert Gentleman and Ross Ihaka
3
 *  Copyright (C) 1995, 1996, 1997 Robert Gentleman and Ross Ihaka
-
 
4
 *  Copyright (C) 1998-1999	The R Core Team
4
 *
5
 *
5
 *  This source code module:
6
 *  This source code module:
6
 *  Copyright (C) 1997, 1998 Paul Murrell and Ross Ihaka
7
 *  Copyright (C) 1997, 1998 Paul Murrell and Ross Ihaka
7
 *
8
 *
8
 *  This program is free software; you can redistribute it and/or modify
9
 *  This program is free software; you can redistribute it and/or modify
Line 34... Line 35...
34
static int MetricUnit = INCHES;
35
static int MetricUnit = INCHES;
35
 
36
 
36
/* Font Definitions */
37
/* Font Definitions */
37
 
38
 
38
typedef enum {
39
typedef enum {
39
    PlainFont      = 1,
40
    PlainFont	   = 1,
40
    BoldFont       = 2,
41
    BoldFont	   = 2,
41
    ItalicFont     = 3,
42
    ItalicFont	   = 3,
42
    BoldItalicFont = 4,
43
    BoldItalicFont = 4,
43
    SymbolFont     = 5,
44
    SymbolFont	   = 5,
44
} FontType;
45
} FontType;
45
 
46
 
46
/*
47
/*
47
 *  Italic Correction Factor
48
 *  Italic Correction Factor
48
 *
49
 *
Line 153... Line 154...
153
    double height, depth, width;
154
    double height, depth, width;
154
    GMetricInfo('g', &height, &depth, &width, MetricUnit, MathDevice);
155
    GMetricInfo('g', &height, &depth, &width, MetricUnit, MathDevice);
155
    return depth;
156
    return depth;
156
}
157
}
157
 
158
 
158
#ifdef NOT_used_currently/*-- out 'def'  (-Wall) --*/
159
#ifdef NOT_used_currently/*-- out 'def'	 (-Wall) --*/
159
static double AscHeight()
160
static double AscHeight()
160
{
161
{
161
    double height, depth, width, save;
162
    double height, depth, width, save;
162
    GMetricInfo('d', &height, &depth, &width, MetricUnit, MathDevice);
163
    GMetricInfo('d', &height, &depth, &width, MetricUnit, MathDevice);
163
    save = height;
164
    save = height;
Line 215... Line 216...
215
 *  Note : The values are ``optimised'' for PostScript.
216
 *  Note : The values are ``optimised'' for PostScript.
216
 *
217
 *
217
 */
218
 */
218
 
219
 
219
typedef enum {
220
typedef enum {
220
    sigma2,  sigma5,  sigma6,  sigma8,  sigma9,  sigma10, sigma11,
221
    sigma2,  sigma5,  sigma6,  sigma8,	sigma9,	 sigma10, sigma11,
221
    sigma12, sigma13, sigma14, sigma15, sigma16, sigma17, sigma18,
222
    sigma12, sigma13, sigma14, sigma15, sigma16, sigma17, sigma18,
222
    sigma19, sigma20, sigma21, sigma22, xi8, xi9, xi10, xi11, xi12, xi13
223
    sigma19, sigma20, sigma21, sigma22, xi8, xi9, xi10, xi11, xi12, xi13
223
}
224
}
224
TEXPAR;
225
TEXPAR;
225
 
226
 
226
#define SUBS           0.7
227
#define SUBS	       0.7
227
 
228
 
228
static double TeX(TEXPAR which)
229
static double TeX(TEXPAR which)
229
{
230
{
230
    switch(which) {
231
    switch(which) {
231
    case sigma2:  /* space */
232
    case sigma2:  /* space */
Line 236... Line 237...
236
	return Quad();
237
	return Quad();
237
 
238
 
238
    case sigma8:  /* num1 */
239
    case sigma8:  /* num1 */
239
	return AxisHeight()
240
	return AxisHeight()
240
	    + 3.51 * RuleThickness()
241
	    + 3.51 * RuleThickness()
241
	    + 0.15 * XHeight()          /* 54/36 * 0.1 */
242
	    + 0.15 * XHeight()		/* 54/36 * 0.1 */
242
	    + SUBS * DescDepth();
243
	    + SUBS * DescDepth();
243
    case sigma9:  /* num2 */
244
    case sigma9:  /* num2 */
244
	return AxisHeight()
245
	return AxisHeight()
245
	    + 1.51 * RuleThickness()
246
	    + 1.51 * RuleThickness()
246
	    + 0.08333333 * XHeight();   /* 30/36 * 0.1 */
247
	    + 0.08333333 * XHeight();	/* 30/36 * 0.1 */
247
    case sigma10: /* num3 */
248
    case sigma10: /* num3 */
248
	return AxisHeight()
249
	return AxisHeight()
249
	    + 1.51 * RuleThickness()
250
	    + 1.51 * RuleThickness()
250
	    + 0.1333333 * XHeight();    /* 48/36 * 0.1 */
251
	    + 0.1333333 * XHeight();	/* 48/36 * 0.1 */
251
    case sigma11: /* denom1 */
252
    case sigma11: /* denom1 */
252
	return  - AxisHeight()
253
	return	- AxisHeight()
253
	    + 3.51 * RuleThickness()
254
	    + 3.51 * RuleThickness()
254
	    + SUBS * FigHeight()
255
	    + SUBS * FigHeight()
255
	    + 0.344444 * XHeight();     /* 124/36 * 0.1 */
256
	    + 0.344444 * XHeight();	/* 124/36 * 0.1 */
256
    case sigma12: /* denom2 */
257
    case sigma12: /* denom2 */
257
	return  - AxisHeight()
258
	return	- AxisHeight()
258
	    + 1.51 * RuleThickness()
259
	    + 1.51 * RuleThickness()
259
	    + SUBS * FigHeight()
260
	    + SUBS * FigHeight()
260
	    + 0.08333333 * XHeight();   /* 30/36 * 0.1 */
261
	    + 0.08333333 * XHeight();	/* 30/36 * 0.1 */
261
 
262
 
262
    case sigma13: /* sup1 */
263
    case sigma13: /* sup1 */
263
	return 0.95 * xHeight();
264
	return 0.95 * xHeight();
264
    case sigma14: /* sup2 */
265
    case sigma14: /* sup2 */
265
	return 0.825 * xHeight();
266
	return 0.825 * xHeight();
Line 283... Line 284...
283
	return 1.01 *XHeight();
284
	return 1.01 *XHeight();
284
 
285
 
285
    case sigma22: /* axis_height */
286
    case sigma22: /* axis_height */
286
	return AxisHeight();
287
	return AxisHeight();
287
 
288
 
288
    case xi8:     /* default_rule_thickness */
289
    case xi8:	  /* default_rule_thickness */
289
	return RuleThickness();
290
	return RuleThickness();
290
 
291
 
291
    case xi9:     /* big_op_spacing1 */
292
    case xi9:	  /* big_op_spacing1 */
292
    case xi10:    /* big_op_spacing2 */
293
    case xi10:	  /* big_op_spacing2 */
293
    case xi11:    /* big_op_spacing3 */
294
    case xi11:	  /* big_op_spacing3 */
294
    case xi12:    /* big_op_spacing4 */
295
    case xi12:	  /* big_op_spacing4 */
295
    case xi13:    /* big_op_spacing5 */
296
    case xi13:	  /* big_op_spacing5 */
296
	return 0.15 * XHeight();
297
	return 0.15 * XHeight();
297
    default:/* never happens (enum type) */
298
    default:/* never happens (enum type) */
298
	error("invalid `which' in TeX()!\n"); return 0;/*-Wall*/
299
	error("invalid `which' in TeX()!\n"); return 0;/*-Wall*/
299
    }
300
    }
300
}
301
}
Line 555... Line 556...
555
static double CenterShift(BBOX bbox)
556
static double CenterShift(BBOX bbox)
556
{
557
{
557
    return 0.5 * (bboxHeight(bbox) - bboxDepth(bbox));
558
    return 0.5 * (bboxHeight(bbox) - bboxDepth(bbox));
558
}
559
}
559
 
560
 
560
#ifdef NOT_used_currently/*-- out 'def'  (-Wall) --*/
561
#ifdef NOT_used_currently/*-- out 'def'	 (-Wall) --*/
561
static BBOX DrawBBox(BBOX bbox, double xoffset, double yoffset)
562
static BBOX DrawBBox(BBOX bbox, double xoffset, double yoffset)
562
{
563
{
563
    double xsaved = CurrentX;
564
    double xsaved = CurrentX;
564
    double ysaved = CurrentY;
565
    double ysaved = CurrentY;
565
    double x[5], y[5];
566
    double x[5], y[5];
Line 602... Line 603...
602
    return !strcmp(CHAR(STRING(expr)[0]), aString);
603
    return !strcmp(CHAR(STRING(expr)[0]), aString);
603
}
604
}
604
/* Code to determine the ascii code corresponding */
605
/* Code to determine the ascii code corresponding */
605
/* to an element of a mathematical expression. */
606
/* to an element of a mathematical expression. */
606
 
607
 
607
#define A_HAT             94
608
#define A_HAT		  94
608
#define A_TILDE          126
609
#define A_TILDE		 126
609
 
610
 
610
#define S_SPACE           32
611
#define S_SPACE		  32
611
#define S_PARENLEFT       40
612
#define S_PARENLEFT	  40
612
#define S_PARENRIGHT      41
613
#define S_PARENRIGHT	  41
613
#define S_ASTERISKMATH    42
614
#define S_ASTERISKMATH	  42
614
#define S_COMMA           44
615
#define S_COMMA		  44
615
#define S_SLASH           47
616
#define S_SLASH		  47
616
#define S_RADICALEX       96
617
#define S_RADICALEX	  96
617
#define S_FRACTION       164
618
#define S_FRACTION	 164
618
#define S_ELLIPSIS       188
619
#define S_ELLIPSIS	 188
619
#define S_INTERSECTION   199
620
#define S_INTERSECTION	 199
620
#define S_UNION          200
621
#define S_UNION		 200
621
#define S_PRODUCT        213
622
#define S_PRODUCT	 213
622
#define S_RADICAL        214
623
#define S_RADICAL	 214
623
#define S_SUM            229
624
#define S_SUM		 229
624
#define S_INTEGRAL       242
625
#define S_INTEGRAL	 242
625
#define S_BRACKETLEFTTP  233
626
#define S_BRACKETLEFTTP	 233
626
#define S_BRACKETLEFTBT  235
627
#define S_BRACKETLEFTBT	 235
627
#define S_BRACKETRIGHTTP 249
628
#define S_BRACKETRIGHTTP 249
628
#define S_BRACKETRIGHTBT 251
629
#define S_BRACKETRIGHTBT 251
629
 
630
 
630
#define N_LIM           1001
631
#define N_LIM		1001
631
#define N_LIMINF        1002
632
#define N_LIMINF	1002
632
#define N_LIMSUP        1003
633
#define N_LIMSUP	1003
633
#define N_INF           1004
634
#define N_INF		1004
634
#define N_SUP           1005
635
#define N_SUP		1005
635
#define N_MIN           1006
636
#define N_MIN		1006
636
#define N_MAX           1007
637
#define N_MAX		1007
637
 
638
 
638
 
639
 
639
/* The Full Adobe Symbol Font */
640
/* The Full Adobe Symbol Font */
640
 
641
 
641
static struct {
642
static struct {
642
    char *name;
643
    char *name;
643
    int code;
644
    int code;
644
}
645
}
645
SymbolTable[] = {
646
SymbolTable[] = {
646
    "space",          32,
647
    "space",	      32,
647
    "exclam",         33,
648
    "exclam",	      33,
648
    "universal",      34,
649
    "universal",      34,
649
    "numbersign",     35,
650
    "numbersign",     35,
650
    "existential",    36,
651
    "existential",    36,
651
    "percent",        37,
652
    "percent",	      37,
652
    "ampersand",      38,
653
    "ampersand",      38,
653
    "suchthat",       39,
654
    "suchthat",	      39,
654
    "parenleft",      40,
655
    "parenleft",      40,
655
    "parenright",     41,
656
    "parenright",     41,
656
    "asteriskmath",   42,
657
    "asteriskmath",   42,
657
    "plus",           43,
658
    "plus",	      43,
658
    "comma",          44,
659
    "comma",	      44,
659
    "minus",          45,
660
    "minus",	      45,
660
    "period",         46,
661
    "period",	      46,
661
    "slash",          47,
662
    "slash",	      47,
662
    "0",              48,
663
    "0",	      48,
663
    "1",              49,
664
    "1",	      49,
664
    "2",              50,
665
    "2",	      50,
665
    "3",              51,
666
    "3",	      51,
666
    "4",              52,
667
    "4",	      52,
667
    "5",              53,
668
    "5",	      53,
668
    "6",              54,
669
    "6",	      54,
669
    "7",              55,
670
    "7",	      55,
670
    "8",              56,
671
    "8",	      56,
671
    "9",              57,
672
    "9",	      57,
672
    "colon",          58,
673
    "colon",	      58,
673
    "semicolon",      59,
674
    "semicolon",      59,
674
    "less",           60,
675
    "less",	      60,
675
    "equal",          61,
676
    "equal",	      61,
676
    "greater",        62,
677
    "greater",	      62,
677
    "question",       63,
678
    "question",	      63,
678
    "congruent",      64,
679
    "congruent",      64,
679
 
680
 
680
    "Alpha",          65,    /* Upper Case Greek Characters */
681
    "Alpha",	      65,    /* Upper Case Greek Characters */
681
    "Beta",           66,
682
    "Beta",	      66,
682
    "Chi",            67,
683
    "Chi",	      67,
683
    "Delta",          68,
684
    "Delta",	      68,
684
    "Epsilon",        69,
685
    "Epsilon",	      69,
685
    "Phi",            70,
686
    "Phi",	      70,
686
    "Gamma",          71,
687
    "Gamma",	      71,
687
    "Eta",            72,
688
    "Eta",	      72,
688
    "Iota",           73,
689
    "Iota",	      73,
689
    "theta1",         74,
690
    "theta1",	      74,
690
    "Kappa",          75,
691
    "Kappa",	      75,
691
    "Lambda",         76,
692
    "Lambda",	      76,
692
    "Mu",             77,
693
    "Mu",	      77,
693
    "Nu",             78,
694
    "Nu",	      78,
694
    "Omicron",        79,
695
    "Omicron",	      79,
695
    "Pi",             80,
696
    "Pi",	      80,
696
    "Theta",          81,
697
    "Theta",	      81,
697
    "Rho",            82,
698
    "Rho",	      82,
698
    "Sigma",          83,
699
    "Sigma",	      83,
699
    "Tau",            84,
700
    "Tau",	      84,
700
    "Upsilon",        85,
701
    "Upsilon",	      85,
701
    "sigma1",         86,
702
    "sigma1",	      86,
702
    "Omega",          87,
703
    "Omega",	      87,
703
    "Xi",             88,
704
    "Xi",	      88,
704
    "Psi",            89,
705
    "Psi",	      89,
705
    "Zeta",           90,
706
    "Zeta",	      90,
706
 
707
 
707
    "bracketleft",    91,    /* Miscellaneous Special Characters */
708
    "bracketleft",    91,    /* Miscellaneous Special Characters */
708
    "therefore",      92,
709
    "therefore",      92,
709
    "bracketright",   93,
710
    "bracketright",   93,
710
    "perpendicular",  94,
711
    "perpendicular",  94,
711
    "underscore",     95,
712
    "underscore",     95,
712
    "radicalex",      96,
713
    "radicalex",      96,
713
 
714
 
714
    "alpha",          97,    /* Lower Case Greek Characters */
715
    "alpha",	      97,    /* Lower Case Greek Characters */
715
    "beta",           98,
716
    "beta",	      98,
716
    "chi",            99,
717
    "chi",	      99,
717
    "delta",         100,
718
    "delta",	     100,
718
    "epsilon",       101,
719
    "epsilon",	     101,
719
    "phi",           102,
720
    "phi",	     102,
720
    "gamma",         103,
721
    "gamma",	     103,
721
    "eta",           104,
722
    "eta",	     104,
722
    "iota",          105,
723
    "iota",	     105,
723
    "phi1",          106,
724
    "phi1",	     106,
724
    "kappa",         107,
725
    "kappa",	     107,
725
    "lambda",        108,
726
    "lambda",	     108,
726
    "mu",            109,
727
    "mu",	     109,
727
    "nu",            110,
728
    "nu",	     110,
728
    "omicron",       111,
729
    "omicron",	     111,
729
    "pi",            112,
730
    "pi",	     112,
730
    "theta",         113,
731
    "theta",	     113,
731
    "rho",           114,
732
    "rho",	     114,
732
    "sigma",         115,
733
    "sigma",	     115,
733
    "tau",           116,
734
    "tau",	     116,
734
    "upsilon",       117,
735
    "upsilon",	     117,
735
    "omega1",        118,
736
    "omega1",	     118,
736
    "omega",         119,
737
    "omega",	     119,
737
    "xi",            120,
738
    "xi",	     120,
738
    "psi",           121,
739
    "psi",	     121,
739
    "zeta",          122,
740
    "zeta",	     122,
740
 
741
 
741
    "braceleft",     123,    /* Miscellaneous Special Characters */
742
    "braceleft",     123,    /* Miscellaneous Special Characters */
742
    "bar",           124,
743
    "bar",	     124,
743
    "braceright",    125,
744
    "braceright",    125,
744
    "similar",       126,
745
    "similar",	     126,
745
 
746
 
746
    "Upsilon1",      161,    /* Lone Greek */
747
    "Upsilon1",	     161,    /* Lone Greek */
747
    "minute",        162,
748
    "minute",	     162,
748
    "lessequal",     163,
749
    "lessequal",     163,
749
    "fraction",      164,
750
    "fraction",	     164,
750
    "infinity",      165,
751
    "infinity",	     165,
751
    "florin",        166,
752
    "florin",	     166,
752
    "club",          167,
753
    "club",	     167,
753
    "diamond",       168,
754
    "diamond",	     168,
754
    "heart",         169,
755
    "heart",	     169,
755
    "spade",         170,
756
    "spade",	     170,
756
    "arrowboth",     171,
757
    "arrowboth",     171,
757
    "arrowleft",     172,
758
    "arrowleft",     172,
758
    "arrowup",       173,
759
    "arrowup",	     173,
759
    "arrowright",    174,
760
    "arrowright",    174,
760
    "arrowdown",     175,
761
    "arrowdown",     175,
761
    "degree",        176,
762
    "degree",	     176,
762
    "plusminus",     177,
763
    "plusminus",     177,
763
    "second",        178,
764
    "second",	     178,
764
    "greaterequal",  179,
765
    "greaterequal",  179,
765
    "multiply",      180,
766
    "multiply",	     180,
766
    "proportional",  181,
767
    "proportional",  181,
767
    "partialdiff",   182,
768
    "partialdiff",   182,
768
    "bullet",        183,
769
    "bullet",	     183,
769
    "divide",        184,
770
    "divide",	     184,
770
    "notequal",      185,
771
    "notequal",	     185,
771
    "equivalence",   186,
772
    "equivalence",   186,
772
    "approxequal",   187,
773
    "approxequal",   187,
773
    "ellipsis",      188,
774
    "ellipsis",	     188,
774
    "arrowvertex",   189,
775
    "arrowvertex",   189,
775
    "arrowhorizex",  190,
776
    "arrowhorizex",  190,
776
    "carriagereturn",191,
777
    "carriagereturn",191,
777
    "aleph",         192,
778
    "aleph",	     192,
778
    "Ifraktur",      193,
779
    "Ifraktur",	     193,
779
    "Rfraktur",      194,
780
    "Rfraktur",	     194,
780
    "weierstrass",   195,
781
    "weierstrass",   195,
781
    "circlemultiply",196,
782
    "circlemultiply",196,
782
    "circleplus",    197,
783
    "circleplus",    197,
783
    "emptyset",      198,
784
    "emptyset",	     198,
784
    "intersection",  199,
785
    "intersection",  199,
785
    "union",         200,
786
    "union",	     200,
786
    "propersuperset",201,
787
    "propersuperset",201,
787
    "reflexsuperset",202,
788
    "reflexsuperset",202,
788
    "notsubset",     203,
789
    "notsubset",     203,
789
    "propersubset",  204,
790
    "propersubset",  204,
790
    "reflexsubset",  205,
791
    "reflexsubset",  205,
791
    "element",       206,
792
    "element",	     206,
792
    "notelement",    207,
793
    "notelement",    207,
793
    "angle",         208,
794
    "angle",	     208,
794
    "gradient",      209,
795
    "gradient",	     209,
795
    "registerserif", 210,
796
    "registerserif", 210,
796
    "copyrightserif",211,
797
    "copyrightserif",211,
797
    "trademarkserif",212,
798
    "trademarkserif",212,
798
    "product",       213,
799
    "product",	     213,
799
    "radical",       214,
800
    "radical",	     214,
800
    "dotmath",       215,
801
    "dotmath",	     215,
801
    "logicaland",    217,
802
    "logicaland",    217,
802
    "logicalor",     218,
803
    "logicalor",     218,
803
    "arrowdblboth",  219,
804
    "arrowdblboth",  219,
804
    "arrowdblleft",  220,
805
    "arrowdblleft",  220,
805
    "arrowdblup",    221,
806
    "arrowdblup",    221,
806
    "arrowdblright", 222,
807
    "arrowdblright", 222,
807
    "arrowdbldown",  223,
808
    "arrowdbldown",  223,
808
    "lozenge",       224,
809
    "lozenge",	     224,
809
    "angleleft",     225,
810
    "angleleft",     225,
810
    "registersans",  226,
811
    "registersans",  226,
811
    "copyrightsans", 227,
812
    "copyrightsans", 227,
812
    "trademarksans", 228,
813
    "trademarksans", 228,
813
    "summation",     229,
814
    "summation",     229,
Line 818... Line 819...
818
    "bracketleftex", 234,
819
    "bracketleftex", 234,
819
    "bracketleftbt", 235,
820
    "bracketleftbt", 235,
820
    "bracelefttp",   236,
821
    "bracelefttp",   236,
821
    "braceleftmid",  237,
822
    "braceleftmid",  237,
822
    "braceleftbt",   238,
823
    "braceleftbt",   238,
823
    "braceex",       239,
824
    "braceex",	     239,
824
    "angleright",    241,
825
    "angleright",    241,
825
    "integral",      242,
826
    "integral",	     242,
826
    "integraltp",    243,
827
    "integraltp",    243,
827
    "integralex",    244,
828
    "integralex",    244,
828
    "integralbt",    245,
829
    "integralbt",    245,
829
    "parenrighttp",  246,
830
    "parenrighttp",  246,
830
    "parenrightex",  247,
831
    "parenrightex",  247,
Line 834... Line 835...
834
    "bracketrightbt",251,
835
    "bracketrightbt",251,
835
    "bracerighttp",  252,
836
    "bracerighttp",  252,
836
    "bracerightmid", 253,
837
    "bracerightmid", 253,
837
    "bracerightbt",  254,
838
    "bracerightbt",  254,
838
 
839
 
839
    NULL,              0,
840
    NULL,	       0,
840
};
841
};
841
 
842
 
842
static int SymbolCode(SEXP expr)
843
static int SymbolCode(SEXP expr)
843
{
844
{
844
    int i;
845
    int i;
Line 849... Line 850...
849
}
850
}
850
 
851
 
851
static int TranslatedSymbol(SEXP expr)
852
static int TranslatedSymbol(SEXP expr)
852
{
853
{
853
    int code = SymbolCode(expr);
854
    int code = SymbolCode(expr);
854
    if ((0101 <= code && code <= 0132)  ||   /* Greek */
855
    if ((0101 <= code && code <= 0132)	||   /* Greek */
855
	(0141 <= code && code <= 0172)  ||   /* Greek */
856
	(0141 <= code && code <= 0172)	||   /* Greek */
856
	code == 0241                    ||   /* Greek */
857
	code == 0241			||   /* Greek */
857
	code == 0242                    ||   /* minute */
858
	code == 0242			||   /* minute */
858
	code == 0245                    ||   /* infinity */
859
	code == 0245			||   /* infinity */
859
	code == 0260                    ||   /* degree */
860
	code == 0260			||   /* degree */
860
	code == 0262                    ||   /* second */
861
	code == 0262			||   /* second */
861
	0)
862
	0)
862
	return code;
863
	return code;
863
    else
864
    else
864
	return 0;
865
	return 0;
865
}
866
}
Line 886... Line 887...
886
static int StringAtom(SEXP expr)
887
static int StringAtom(SEXP expr)
887
{
888
{
888
    return (TYPEOF(expr) == STRSXP);
889
    return (TYPEOF(expr) == STRSXP);
889
}
890
}
890
 
891
 
891
#ifdef NOT_used_currently/*-- out 'def'  (-Wall) --*/
892
#ifdef NOT_used_currently/*-- out 'def'	 (-Wall) --*/
892
static int symbolAtom(SEXP expr)
893
static int symbolAtom(SEXP expr)
893
{
894
{
894
    int i;
895
    int i;
895
    if (NameAtom(expr)) {
896
    if (NameAtom(expr)) {
896
	for (i = 0; SymbolTable[i].code; i++)
897
	for (i = 0; SymbolTable[i].code; i++)
Line 901... Line 902...
901
}
902
}
902
#endif
903
#endif
903
/* Code to determine a font from the */
904
/* Code to determine a font from the */
904
/* nature of the expression */
905
/* nature of the expression */
905
 
906
 
906
#ifdef NOT_used_currently/*-- out 'def'  (-Wall) --*/
907
#ifdef NOT_used_currently/*-- out 'def'	 (-Wall) --*/
907
static FontType CurrentFont = 3;
908
static FontType CurrentFont = 3;
908
#endif
909
#endif
909
static FontType GetFont()
910
static FontType GetFont()
910
{
911
{
911
    return MathDevice->gp.font;
912
    return MathDevice->gp.font;
Line 941... Line 942...
941
static BBOX RenderOffsetElement(SEXP, double, double, int);
942
static BBOX RenderOffsetElement(SEXP, double, double, int);
942
static BBOX RenderExpression(SEXP, int);
943
static BBOX RenderExpression(SEXP, int);
943
static BBOX RenderSymbolChar(int, int);
944
static BBOX RenderSymbolChar(int, int);
944
 
945
 
945
 
946
 
946
/*  Code to Generate Bounding Boxes and Draw Formulae.  */
947
/*  Code to Generate Bounding Boxes and Draw Formulae.	*/
947
 
948
 
948
static BBOX RenderItalicCorr(BBOX bbox, int draw)
949
static BBOX RenderItalicCorr(BBOX bbox, int draw)
949
{
950
{
950
    if (bboxItalic(bbox) > 0) {
951
    if (bboxItalic(bbox) > 0) {
951
	if (draw)
952
	if (draw)
Line 1119... Line 1120...
1119
/* Code for Ellipsis (ldots, cdots, ...) */
1120
/* Code for Ellipsis (ldots, cdots, ...) */
1120
 
1121
 
1121
static int DotsAtom(SEXP expr)
1122
static int DotsAtom(SEXP expr)
1122
{
1123
{
1123
    if (NameMatch(expr, "cdots") ||
1124
    if (NameMatch(expr, "cdots") ||
1124
	NameMatch(expr, "...")   ||
1125
	NameMatch(expr, "...")	 ||
1125
	NameMatch(expr, "ldots"))
1126
	NameMatch(expr, "ldots"))
1126
            return 1;
1127
	    return 1;
1127
    return 0;
1128
    return 0;
1128
}
1129
}
1129
 
1130
 
1130
static BBOX RenderDots(SEXP expr, int draw)
1131
static BBOX RenderDots(SEXP expr, int draw)
1131
{
1132
{
Line 1200... Line 1201...
1200
	opBBox = CombineBBoxes(opBBox, arg2BBox);
1201
	opBBox = CombineBBoxes(opBBox, arg2BBox);
1201
	return opBBox;
1202
	return opBBox;
1202
    }
1203
    }
1203
    else
1204
    else
1204
	error("invalid mathematical annotation\n");
1205
	error("invalid mathematical annotation\n");
1205
 
-
 
1206
}
1206
}
1207
 
1207
 
1208
static SymTab BinTable[] = {
1208
static SymTab BinTable[] = {
1209
    "*",                052,    /* Binary Operators */
1209
    "*",		052,	/* Binary Operators */
1210
    "+",                053,
1210
    "+",		053,
1211
    "-",                055,
1211
    "-",		055,
1212
    "/",                057,
1212
    "/",		057,
1213
    ":",                072,
1213
    ":",		072,
1214
    "%+-%",            0261,
1214
    "%+-%",	       0261,
1215
    "%*%",             0264,
1215
    "%*%",	       0264,
1216
    "%/%",             0270,
1216
    "%/%",	       0270,
1217
    "%intersection%",  0307,
1217
    "%intersection%",  0307,
1218
    "%union%",         0310,
1218
    "%union%",	       0310,
1219
    NULL,                 0
1219
    NULL,		  0
1220
};
1220
};
1221
 
1221
 
1222
static int BinAtom(SEXP expr)
1222
static int BinAtom(SEXP expr)
1223
{
1223
{
1224
    int i;
1224
    int i;
Line 1464... Line 1464...
1464
 */
1464
 */
1465
 
1465
 
1466
#define ACCENT_GAP  0.2
1466
#define ACCENT_GAP  0.2
1467
#define HAT_HEIGHT  0.3
1467
#define HAT_HEIGHT  0.3
1468
 
1468
 
1469
#define NTILDE      8
1469
#define NTILDE	    8
1470
#define DELTA       0.05
1470
#define DELTA	    0.05
1471
 
1471
 
1472
static int WideTildeAtom(SEXP expr)
1472
static int WideTildeAtom(SEXP expr)
1473
{
1473
{
1474
    return NameAtom(expr) && NameMatch(expr, "widetilde");
1474
    return NameAtom(expr) && NameMatch(expr, "widetilde");
1475
}
1475
}
Line 1582... Line 1582...
1582
static struct {
1582
static struct {
1583
    char *name;
1583
    char *name;
1584
    int code;
1584
    int code;
1585
}
1585
}
1586
AccentTable[] = {
1586
AccentTable[] = {
1587
    "hat",            94,
1587
    "hat",	      94,
1588
    "ring",          176,
1588
    "ring",	     176,
1589
    "tilde",         126,
1589
    "tilde",	     126,
1590
    NULL,              0,
1590
    NULL,	       0,
1591
};
1591
};
1592
 
1592
 
1593
static int AccentCode(SEXP expr)
1593
static int AccentCode(SEXP expr)
1594
{
1594
{
1595
    int i;
1595
    int i;
Line 1749... Line 1749...
1749
}
1749
}
1750
 
1750
 
1751
static int OverAtom(SEXP expr)
1751
static int OverAtom(SEXP expr)
1752
{
1752
{
1753
    return NameAtom(expr) &&
1753
    return NameAtom(expr) &&
1754
        (NameMatch(expr, "over") || NameMatch(expr, "frac"));
1754
	(NameMatch(expr, "over") || NameMatch(expr, "frac"));
1755
}
1755
}
1756
 
1756
 
1757
static BBOX RenderOver(SEXP expr, int draw)
1757
static BBOX RenderOver(SEXP expr, int draw)
1758
{
1758
{
1759
    return RenderFraction(expr, 1, draw);
1759
    return RenderFraction(expr, 1, draw);
Line 1908... Line 1908...
1908
    case '}':
1908
    case '}':
1909
	top = 252; ext = 239; bot = 254; mid = 253;
1909
	top = 252; ext = 239; bot = 254; mid = 253;
1910
	break;
1910
	break;
1911
    default:
1911
    default:
1912
	error("group is incomplete\n");
1912
	error("group is incomplete\n");
1913
	break;
1913
	return ansBBox;/*never reached*/
1914
    }
1914
    }
1915
    topBBox = GlyphBBox(top);
1915
    topBBox = GlyphBBox(top);
1916
    extBBox = GlyphBBox(ext);
1916
    extBBox = GlyphBBox(ext);
1917
    botBBox = GlyphBBox(bot);
1917
    botBBox = GlyphBBox(bot);
1918
    if (which == '{' || which == '}') {
1918
    if (which == '{' || which == '}') {
Line 1987... Line 1987...
1987
    delim1 = DelimCode(expr, CADR(expr));
1987
    delim1 = DelimCode(expr, CADR(expr));
1988
    delim2 = DelimCode(expr, CADDDR(expr));
1988
    delim2 = DelimCode(expr, CADDDR(expr));
1989
    bbox = RenderElement(CADDR(expr), 0);
1989
    bbox = RenderElement(CADDR(expr), 0);
1990
    dist = max(bboxHeight(bbox) - axisHeight, bboxDepth(bbox) + axisHeight);
1990
    dist = max(bboxHeight(bbox) - axisHeight, bboxDepth(bbox) + axisHeight);
1991
    bbox = RenderDelim(delim1, dist + extra, draw);
1991
    bbox = RenderDelim(delim1, dist + extra, draw);
1992
    bbox = CombineBBoxes(bbox,  RenderElement(CADDR(expr), draw));
1992
    bbox = CombineBBoxes(bbox,	RenderElement(CADDR(expr), draw));
1993
    bbox = RenderItalicCorr(bbox, draw);
1993
    bbox = RenderItalicCorr(bbox, draw);
1994
    bbox = CombineBBoxes(bbox,  RenderDelim(delim2, dist + extra, draw));
1994
    bbox = CombineBBoxes(bbox,	RenderDelim(delim2, dist + extra, draw));
1995
    return bbox;
1995
    return bbox;
1996
}
1996
}
1997
 
1997
 
1998
/*----------------------------------------------------------------------
1998
/*----------------------------------------------------------------------
1999
 *
1999
 *
Line 2105... Line 2105...
2105
 */
2105
 */
2106
 
2106
 
2107
#define OperatorSymbolMag  1.25
2107
#define OperatorSymbolMag  1.25
2108
 
2108
 
2109
static SymTab OpTable[] = {
2109
static SymTab OpTable[] = {
2110
    "prod",          S_PRODUCT,
2110
    "prod",	     S_PRODUCT,
2111
    "sum",           S_SUM,
2111
    "sum",	     S_SUM,
2112
    "union",         S_UNION,
2112
    "union",	     S_UNION,
2113
    "intersect",     S_INTERSECTION,
2113
    "intersect",     S_INTERSECTION,
2114
    "lim",           N_LIM,
2114
    "lim",	     N_LIM,
2115
    "liminf",        N_LIMINF,
2115
    "liminf",	     N_LIMINF,
2116
    "limsup",        N_LIMINF,
2116
    "limsup",	     N_LIMINF,
2117
    "inf",           N_INF,
2117
    "inf",	     N_INF,
2118
    "sup",           N_SUP,
2118
    "sup",	     N_SUP,
2119
    "min",           N_MIN,
2119
    "min",	     N_MIN,
2120
    "max",           N_MAX,
2120
    "max",	     N_MAX,
2121
    NULL,            0
2121
    NULL,	     0
2122
};
2122
};
2123
 
2123
 
2124
static int OpAtom(SEXP expr)
2124
static int OpAtom(SEXP expr)
2125
{
2125
{
2126
    int i;
2126
    int i;
Line 2225... Line 2225...
2225
 *
2225
 *
2226
 *  Code for radical expressions (root, sqrt)
2226
 *  Code for radical expressions (root, sqrt)
2227
 *
2227
 *
2228
 *  Tunable parameteters :
2228
 *  Tunable parameteters :
2229
 *
2229
 *
2230
 *  RADICAL_GAP    The gap between the nucleus and the radical extension.
2230
 *  RADICAL_GAP	   The gap between the nucleus and the radical extension.
2231
 *  RADICAL_SPACE  Extra space to the left and right of the nucleus.
2231
 *  RADICAL_SPACE  Extra space to the left and right of the nucleus.
2232
 *
2232
 *
2233
 */
2233
 */
2234
 
2234
 
2235
#define RADICAL_GAP    0.4
2235
#define RADICAL_GAP    0.4
Line 2397... Line 2397...
2397
 *
2397
 *
2398
 *  Code for Relation Expressions (i.e. ... ==, !=, ...)
2398
 *  Code for Relation Expressions (i.e. ... ==, !=, ...)
2399
 *
2399
 *
2400
 */
2400
 */
2401
 
2401
 
2402
                                /* Binary Relationships */
2402
				/* Binary Relationships */
2403
 
2403
 
2404
SymTab RelTable[] = {
2404
SymTab RelTable[] = {
2405
    "<",                 60,    /* less */
2405
    "<",		 60,	/* less */
2406
    "==",                61,    /* equal */
2406
    "==",		 61,	/* equal */
2407
    ">",                 62,    /* greater */
2407
    ">",		 62,	/* greater */
2408
    "%=~%",              64,    /* congruent */
2408
    "%=~%",		 64,	/* congruent */
2409
    "!=",               185,    /* not equal */
2409
    "!=",		185,	/* not equal */
2410
    "<=",               163,    /* less or equal */
2410
    "<=",		163,	/* less or equal */
2411
    ">=",               179,    /* greater or equal */
2411
    ">=",		179,	/* greater or equal */
2412
    "%==%",             186,    /* equivalence */
2412
    "%==%",		186,	/* equivalence */
2413
    "%~~%",             187,    /* approxequal */
2413
    "%~~%",		187,	/* approxequal */
2414
 
2414
 
2415
    "%<->%",            171,    /* Arrows */
2415
    "%<->%",		171,	/* Arrows */
2416
    "%<-%",             172,
2416
    "%<-%",		172,
2417
    "%up%",             173,
2417
    "%up%",		173,
2418
    "%->%",             174,
2418
    "%->%",		174,
2419
    "%down%",           175,
2419
    "%down%",		175,
2420
    "%<=>%",            219,
2420
    "%<=>%",		219,
2421
    "%<=%",             220,
2421
    "%<=%",		220,
2422
    "%dblup%",          221,
2422
    "%dblup%",		221,
2423
    "%=>%",             222,
2423
    "%=>%",		222,
2424
    "%dbldown%",        223,
2424
    "%dbldown%",	223,
2425
 
2425
 
2426
    "%supset%",         201,    /* Sets (TeX Names) */
2426
    "%supset%",		201,	/* Sets (TeX Names) */
2427
    "%supseteq%",       202,
2427
    "%supseteq%",	202,
2428
    "%notsubset%",      203,
2428
    "%notsubset%",	203,
2429
    "%subset%",         204,
2429
    "%subset%",		204,
2430
    "%subseteq%",       205,
2430
    "%subseteq%",	205,
2431
    "%in%",             206,
2431
    "%in%",		206,
2432
    "%notin%",          207,
2432
    "%notin%",		207,
2433
 
2433
 
2434
    NULL,                0,
2434
    NULL,		 0,
2435
};
2435
};
2436
 
2436
 
2437
static int RelAtom(SEXP expr)
2437
static int RelAtom(SEXP expr)
2438
{
2438
{
2439
    int i;
2439
    int i;
Line 2737... Line 2737...
2737
    else if (BGroupAtom(head))
2737
    else if (BGroupAtom(head))
2738
	return RenderBGroup(expr, draw);
2738
	return RenderBGroup(expr, draw);
2739
    else if (GroupAtom(head))
2739
    else if (GroupAtom(head))
2740
	return RenderGroup(expr, draw);
2740
	return RenderGroup(expr, draw);
2741
    else if (IntAtom(head))
2741
    else if (IntAtom(head))
2742
       	return RenderInt(expr, draw);
2742
	return RenderInt(expr, draw);
2743
    else if (OpAtom(head))
2743
    else if (OpAtom(head))
2744
	return RenderOp(expr, draw);
2744
	return RenderOp(expr, draw);
2745
    else if (RadicalAtom(head))
2745
    else if (RadicalAtom(head))
2746
	return RenderRadical(expr, draw);
2746
	return RenderRadical(expr, draw);
2747
    else if (AbsAtom(head))
2747
    else if (AbsAtom(head))
Line 2890... Line 2890...
2890
 
2890
 
2891
 
2891
 
2892
void GMMathText(SEXP str, int side, double line, int outer,
2892
void GMMathText(SEXP str, int side, double line, int outer,
2893
		double at, int las, DevDesc *dd)
2893
		double at, int las, DevDesc *dd)
2894
{
2894
{
2895
    int coords;
2895
    int coords = 0;
2896
    double a, xadj, yadj;
2896
    double a, xadj, yadj;
2897
 
2897
 
2898
    MathDevice = dd;
2898
    MathDevice = dd;
2899
 
2899
 
2900
    if (outer) {
2900
    if (outer) {
Line 2923... Line 2923...
2923
	    coords = MAR4;
2923
	    coords = MAR4;
2924
	    a = 90.0;
2924
	    a = 90.0;
2925
	    xadj = MathDevice->gp.adj;
2925
	    xadj = MathDevice->gp.adj;
2926
	    yadj = NA_REAL;
2926
	    yadj = NA_REAL;
2927
	    break;
2927
	    break;
-
 
2928
	default: return;/* never happens */
2928
	}
2929
	}
2929
	GMathText(at, line, coords, str, xadj, yadj, a, dd);
2930
	GMathText(at, line, coords, str, xadj, yadj, a, dd);
2930
    }
2931
    }
2931
    else {
2932
    else {
2932
	switch (side) {
2933
	switch (side) {
2933
	case 1:
2934
	case 1:
2934
	    if (las == 2) {
2935
	    if (las == 2 || las == 3) {/* perpendicular */
2935
		at = at - GConvertXUnits(dd->gp.yLineBias,
2936
		at = at - GConvertXUnits(dd->gp.yLineBias,
2936
					 LINES, USER, dd);
2937
					 LINES, USER, dd);
2937
		line = line + dd->gp.yLineBias;
2938
		line = line + dd->gp.yLineBias;
2938
		a = 90.0;
2939
		a = 90.0;
2939
		xadj = 1.0;
2940
		xadj = 1.0;
Line 2963... Line 2964...
2963
		yadj = NA_REAL;
2964
		yadj = NA_REAL;
2964
	    }
2965
	    }
2965
	    coords = MAR2;
2966
	    coords = MAR2;
2966
	    break;
2967
	    break;
2967
	case 3:
2968
	case 3:
2968
	    if (las == 2) {
2969
	    if (las == 2 || las == 3) {/* perpendicular */
2969
		at = at - GConvertXUnits(dd->gp.yLineBias,
2970
		at = at - GConvertXUnits(dd->gp.yLineBias,
2970
					 LINES, USER, dd);
2971
					 LINES, USER, dd);
2971
		line = line + dd->gp.yLineBias;
2972
		line = line + dd->gp.yLineBias;
2972
		a = 90.0;
2973
		a = 90.0;
2973
		xadj = 0.0;
2974
		xadj = 0.0;
Line 2996... Line 2997...
2996
		xadj = MathDevice->gp.adj;
2997
		xadj = MathDevice->gp.adj;
2997
		yadj = NA_REAL;
2998
		yadj = NA_REAL;
2998
	    }
2999
	    }
2999
	    coords = MAR4;
3000
	    coords = MAR4;
3000
	    break;
3001
	    break;
-
 
3002
	default: return;/* never happens */
3001
	}
3003
	}
3002
	GMathText(at, line, coords, str, xadj, yadj, a, dd);
3004
	GMathText(at, line, coords, str, xadj, yadj, a, dd);
3003
    }
3005
    }
3004
}
3006
}