2 /* Copyright (C) 1989, 1990, 1991, 1992 Free Software Foundation, Inc.
3 Written by James Clark (jjc@jclark.com)
5 This file is part of groff.
7 groff is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
12 groff is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License along
18 with groff; see the file COPYING. If not, write to the Free Software
19 Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
24 class over_box : public box {
30 over_box(int small, box *, box *);
33 int compute_metrics(int);
38 box *make_over_box(box *pp, box *qq)
40 return new over_box(0, pp, qq);
43 box *make_small_over_box(box *pp, box *qq)
45 return new over_box(1, pp, qq);
48 over_box::over_box(int is_small, box *pp, box *qq)
49 : num(pp), den(qq), reduce_size(is_small)
51 spacing_type = INNER_TYPE;
60 int over_box::compute_metrics(int style)
63 style = script_style(style);
64 printf(".nr " SIZE_FORMAT " \\n[.s]\n", uid);
66 printf(".nr " SMALL_SIZE_FORMAT " \\n[.s]\n", uid);
69 int res = num->compute_metrics(style);
72 int r = den->compute_metrics(cramped_style(style));
74 error("multiple marks and lineups");
80 printf(".ps \\n[" SIZE_FORMAT "]\n", uid);
81 printf(".nr " WIDTH_FORMAT " (\\n[" WIDTH_FORMAT "]>?\\n[" WIDTH_FORMAT "]",
82 uid, num->uid, den->uid);
83 // allow for \(ru being wider than both the numerator and denominator
85 fputs(">?\\w" DELIMITER_CHAR "\\(ru" DELIMITER_CHAR, stdout);
86 printf(")+%dM\n", null_delimiter_space*2 + over_hang*2);
88 printf(".nr " SUP_RAISE_FORMAT " %dM\n",
89 uid, (reduce_size ? num2 : num1));
90 printf(".nr " SUB_LOWER_FORMAT " %dM\n",
91 uid, (reduce_size ? denom2 : denom1));
94 printf(".nr " SUP_RAISE_FORMAT " +(\\n[" DEPTH_FORMAT
95 "]-\\n[" SUP_RAISE_FORMAT "]+%dM+(%dM/2)+%dM)>?0\n",
96 uid, num->uid, uid, axis_height, default_rule_thickness,
97 default_rule_thickness*(reduce_size ? 1 : 3));
98 printf(".nr " SUB_LOWER_FORMAT " +(\\n[" HEIGHT_FORMAT
99 "]-\\n[" SUB_LOWER_FORMAT "]-%dM+(%dM/2)+%dM)>?0\n",
100 uid, den->uid, uid, axis_height, default_rule_thickness,
101 default_rule_thickness*(reduce_size ? 1 : 3));
104 printf(".nr " HEIGHT_FORMAT " \\n[" SUP_RAISE_FORMAT "]+\\n["
107 printf(".nr " DEPTH_FORMAT " \\n[" SUB_LOWER_FORMAT "]+\\n["
111 printf(".nr " MARK_REG " +(\\n[" WIDTH_FORMAT "]-\\n["
112 WIDTH_FORMAT "]/2)\n", uid, mark_uid);
118 void over_box::output()
121 printf("\\s[\\n[" SMALL_SIZE_FORMAT "]]", uid);
123 printf("\\Z" DELIMITER_CHAR);
125 // move up to the numerator baseline
126 printf("\\v'-\\n[" SUP_RAISE_FORMAT "]u'", uid);
127 // move across so that it's centered
128 printf("\\h'\\n[" WIDTH_FORMAT "]u-\\n[" WIDTH_FORMAT "]u/2u'",
131 // print the numerator
135 printf(DELIMITER_CHAR);
138 printf("\\h'-\\n[" WIDTH_FORMAT "]u'", num->uid);
139 printf("\\h'-(\\n[" WIDTH_FORMAT "]u-\\n[" WIDTH_FORMAT "]u/2u)'",
142 printf("\\v'\\n[" SUP_RAISE_FORMAT "]u'", uid);
145 printf("\\Z" DELIMITER_CHAR);
147 // move down to the denominator baseline
148 printf("\\v'\\n[" SUB_LOWER_FORMAT "]u'", uid);
150 // move across so that it's centered
151 printf("\\h'\\n[" WIDTH_FORMAT "]u-\\n[" WIDTH_FORMAT "]u/2u'",
154 // print the the denominator
158 printf(DELIMITER_CHAR);
161 printf("\\h'-\\n[" WIDTH_FORMAT "]u'", den->uid);
162 printf("\\h'-(\\n[" WIDTH_FORMAT "]u-\\n[" WIDTH_FORMAT "]u/2u)'",
165 printf("\\v'-\\n[" SUB_LOWER_FORMAT "]u'", uid);
168 printf("\\s[\\n[" SIZE_FORMAT "]]", uid);
170 printf("\\h'%dM'", null_delimiter_space);
171 printf("\\v'-%dM'", axis_height);
172 fputs(draw_flag ? "\\D'l" : "\\l'", stdout);
173 printf("\\n[" WIDTH_FORMAT "]u-%dM",
174 uid, 2*null_delimiter_space);
175 fputs(draw_flag ? " 0'" : "\\&\\(ru'", stdout);
176 printf("\\v'%dM'", axis_height);
177 printf("\\h'%dM'", null_delimiter_space);
180 void over_box::debug_print()
182 fprintf(stderr, "{ ");
185 fprintf(stderr, " } smallover { ");
187 fprintf(stderr, " } over { ");
189 fprintf(stderr, " }");
192 void over_box::check_tabs(int level)
194 num->check_tabs(level + 1);
195 den->check_tabs(level + 1);