/* Copyright (C) 1989, 1990 Free Software Foundation, Inc.
Written by James Clark (jjc@jclark.uucp)
This file is part of groff.
groff is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 1, or (at your option) any later
groff is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
You should have received a copy of the GNU General Public License along
with groff; see the file LICENSE. If not, write to the Free Software
Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
// SUP_RAISE_FORMAT gives the first baseline
// BASELINE_SEP_FORMAT gives the separation between baselines
int pile_box::compute_metrics(int style
)
for (i
= 0; i
< col
.len
; i
++)
col
.p
[i
]->compute_metrics(style
);
printf(".nr " WIDTH_FORMAT
" 0", uid
);
for (i
= 0; i
< col
.len
; i
++)
printf(">?\\n[" WIDTH_FORMAT
"]", col
.p
[i
]->uid
);
printf(".nr " BASELINE_SEP_FORMAT
" %dM",
uid
, baseline_sep
+col
.space
);
for (i
= 1; i
< col
.len
; i
++)
printf(">?(\\n[" DEPTH_FORMAT
"]+\\n[" HEIGHT_FORMAT
"]+%dM)",
col
.p
[i
-1]->uid
, col
.p
[i
]->uid
, default_rule_thickness
*5);
// round it so that it's a multiple of the vertical resolution
printf("/\\n(.V+(\\n(.V/2)*\\n(.V\n");
printf(".nr " SUP_RAISE_FORMAT
" \\n[" BASELINE_SEP_FORMAT
"]*%d/2"
uid
, uid
, col
.len
-1, axis_height
- shift_down
);
printf(".nr " HEIGHT_FORMAT
" \\n[" SUP_RAISE_FORMAT
"]+\\n["
uid
, uid
, col
.p
[0]->uid
);
printf(".nr " DEPTH_FORMAT
" \\n[" BASELINE_SEP_FORMAT
"]*%d+\\n["
DEPTH_FORMAT
"]-\\n[" SUP_RAISE_FORMAT
"]\n",
uid
, uid
, col
.len
-1, col
.p
[col
.len
-1]->uid
, uid
);
printf("\\v'-\\n[" SUP_RAISE_FORMAT
"]u'", uid
);
for (i
= 0; i
< col
.len
; i
++) {
printf("\\h'\\n[" WIDTH_FORMAT
"]u-\\n[" WIDTH_FORMAT
"]u/2u'",
printf("\\h'\\n[" WIDTH_FORMAT
"]u-\\n[" WIDTH_FORMAT
"]u'",
printf("\\h'-\\n[" WIDTH_FORMAT
"]u'", col
.p
[i
]->uid
);
printf("\\h'\\n[" WIDTH_FORMAT
"]u-\\n[" WIDTH_FORMAT
"]u/2u'",
printf("\\h'\\n[" WIDTH_FORMAT
"]u-\\n[" WIDTH_FORMAT
"]u'",
printf("\\v'\\n[" BASELINE_SEP_FORMAT
"]u'", uid
);
printf("\\v'\\n[" SUP_RAISE_FORMAT
"]u'", uid
);
printf("\\v'-(%du*\\n[" BASELINE_SEP_FORMAT
"]u)'", col
.len
- 1, uid
);
printf("\\h'\\n[" WIDTH_FORMAT
"]u'", uid
);
pile_box::pile_box(box
*pp
) : col(pp
)
void pile_box::check_tabs(int level
)
col
.list_check_tabs(level
);
void pile_box::debug_print()
int matrix_box::compute_metrics(int style
)
for (i
= 0; i
< len
; i
++) {
for (j
= 0; j
< p
[i
]->len
; j
++)
p
[i
]->p
[j
]->compute_metrics(style
);
for (i
= 0; i
< len
; i
++) {
printf(".nr " COLUMN_WIDTH_FORMAT
" 0", uid
, i
);
for (j
= 0; j
< p
[i
]->len
; j
++)
printf(">?\\n[" WIDTH_FORMAT
"]", p
[i
]->p
[j
]->uid
);
printf(".nr " WIDTH_FORMAT
" %dM",
uid
, column_sep
*(len
-1)+2*matrix_side_sep
);
for (i
= 0; i
< len
; i
++)
printf("+\\n[" COLUMN_WIDTH_FORMAT
"]", uid
, i
);
printf(".nr " BASELINE_SEP_FORMAT
" %dM",
uid
, baseline_sep
+space
);
for (i
= 0; i
< len
; i
++)
for (j
= 1; j
< p
[i
]->len
; j
++)
printf(">?(\\n[" DEPTH_FORMAT
"]+\\n[" HEIGHT_FORMAT
"]+%dM)",
p
[i
]->p
[j
-1]->uid
, p
[i
]->p
[j
]->uid
, default_rule_thickness
*5);
// round it so that it's a multiple of the vertical resolution
printf("/\\n(.V+(\\n(.V/2)*\\n(.V\n");
printf(".nr " SUP_RAISE_FORMAT
" \\n[" BASELINE_SEP_FORMAT
"]*%d/2"
uid
, uid
, maxlen
-1, axis_height
- shift_down
);
printf(".nr " HEIGHT_FORMAT
" \\n[" SUP_RAISE_FORMAT
"]+(0",
for (i
= 0; i
< len
; i
++)
printf(">?\\n[" HEIGHT_FORMAT
"]", p
[i
]->p
[0]->uid
);
printf(".nr " DEPTH_FORMAT
" \\n[" BASELINE_SEP_FORMAT
"]*%d-\\n["
uid
, uid
, maxlen
-1, uid
);
for (i
= 0; i
< len
; i
++)
printf(">?\\n[" DEPTH_FORMAT
"]", p
[i
]->p
[maxlen
-1]->uid
);
void matrix_box::output()
printf("\\h'%dM'", matrix_side_sep
);
for (int i
= 0; i
< len
; i
++) {
printf("\\v'-\\n[" SUP_RAISE_FORMAT
"]u'", uid
);
for (j
= 0; j
< p
[i
]->len
; j
++) {
printf("\\h'\\n[" COLUMN_WIDTH_FORMAT
"]u-\\n[" WIDTH_FORMAT
"]u/2u'",
uid
, i
, p
[i
]->p
[j
]->uid
);
printf("\\h'\\n[" COLUMN_WIDTH_FORMAT
"]u-\\n[" WIDTH_FORMAT
"]u'",
uid
, i
, p
[i
]->p
[j
]->uid
);
printf("\\h'-\\n[" WIDTH_FORMAT
"]u'", p
[i
]->p
[j
]->uid
);
printf("\\h'\\n[" WIDTH_FORMAT
"]u-\\n[" COLUMN_WIDTH_FORMAT
"]u/2u'",
p
[i
]->p
[j
]->uid
, uid
, i
);
printf("\\h'\\n[" WIDTH_FORMAT
"]u-\\n[" COLUMN_WIDTH_FORMAT
"]u'",
p
[i
]->p
[j
]->uid
, uid
, i
);
printf("\\v'\\n[" BASELINE_SEP_FORMAT
"]u'", uid
);
printf("\\v'\\n[" SUP_RAISE_FORMAT
"]u'", uid
);
printf("\\v'-(%du*\\n[" BASELINE_SEP_FORMAT
"]u)'", p
[i
]->len
- 1, uid
);
printf("\\h'\\n[" COLUMN_WIDTH_FORMAT
"]u'", uid
, i
);
printf("\\h'%dM'", column_sep
);
printf("\\h'%dM'", matrix_side_sep
);
matrix_box::matrix_box(column
*pp
)
for (int i
= 0; i
< 10; i
++)
matrix_box::~matrix_box()
for (int i
= 0; i
< len
; i
++)
void matrix_box::append(column
*pp
)
memcpy(p
, oldp
, sizeof(column
*)*len
);
void matrix_box::check_tabs(int level
)
for (int i
= 0; i
< len
; i
++)
p
[i
]->list_check_tabs(level
);
void matrix_box::debug_print()
fprintf(stderr
, "matrix { ");
p
[0]->debug_print("col");
for (int i
= 1; i
< len
; i
++) {
p
[i
]->debug_print("col");
column::column(box
*pp
) : box_list(pp
), align(CENTER_ALIGN
), space(0)
void column::set_alignment(alignment a
)
void column::set_space(int n
)
void column::debug_print(const char *s
)
char c
= '\0'; // shut up -Wall
fprintf(stderr
, "%c%s %d { ", c
, s
, space
);
list_debug_print(" above ");