4 * In Neateqn equations are recursively decomposed into boxes. eqn.c
5 * reads the input and makes eqn boxes by calling appropriate functions
8 /* predefined array sizes */
9 #define FNLEN 32 /* font name length */
10 #define SZLEN 32 /* point size length */
11 #define LNLEN 1000 /* line length */
12 #define NMLEN 32 /* macro name length */
13 #define RLEN 8 /* register name length */
14 #define NPILES 32 /* number of piled items */
15 #define NSIZES 8 /* number of bracket sizes */
16 #define GNLEN 32 /* glyph name length */
17 #define BRLEN 64 /* bracket definition length */
19 /* registers used by neateqn */
20 #define EQNSZ ".eqnsz" /* register for surrounding point size */
21 #define EQNFN ".eqnfn" /* register for surrounding font */
22 #define EQNS "10" /* eqn-collected line register */
23 #define EQNMK ".eqnmk" /* eqn horizontal mark */
26 #define MIN(a, b) ((a) < (b) ? (a) : (b))
27 #define MAX(a, b) ((a) < (b) ? (b) : (a))
28 #define LEN(a) (sizeof(a) / sizeof((a)[0]))
30 /* token and atom types */
31 #define T_TOK(t) ((t) & 0x00ff)
32 #define T_ATOM(t) ((t) & 0x00f0)
33 #define T_FONT(t) ((t) & T_ITALIC)
34 #define T_ATOMIDX(t) ((((t) >> 4) & 15) - 1)
36 #define T_EOF 0x0000 /* parser-specific */
37 #define T_SPACE 0x0001
39 #define T_KEYWORD 0x0003
40 #define T_ORD 0x0010 /* ordinary */
41 #define T_LETTER 0x0011
42 #define T_NUMBER 0x0012
43 #define T_STRING 0x0013
45 #define T_BIGOP 0x0020 /* big operators */
46 #define T_BINOP 0x0030 /* binary operators */
47 #define T_RELOP 0x0040 /* relational symbol */
48 #define T_LEFT 0x0050 /* opening token */
49 #define T_RIGHT 0x0060 /* closing token */
50 #define T_PUNC 0x0070 /* punctuation symbol */
51 #define T_INNER 0x0080 /* like fractions */
53 #define T_ITALIC 0x0100 /* atom with italic font */
55 /* spaces in hundredths of em */
56 #define S_S1 e_thinspace /* thin space */
57 #define S_S2 e_mediumspace /* medium space */
58 #define S_S3 e_thickspace /* thick space */
60 /* reading the source */
63 void src_define(char *name
, char *def
);
64 int src_expand(char *name
, char **args
);
65 int src_macro(char *name
);
68 int src_lineget(void);
69 void src_lineset(int n
);
74 void tok_eqnout(char *s
);
77 char *tok_poptext(int sep
);
78 int tok_jmp(char *kwd
);
80 int tok_chops(int soft
);
85 /* default definitions and operators */
86 int def_type(char *s
);
87 void def_typeput(char *s
, int type
);
88 int def_chopped(int c
);
89 void def_choppedset(char *s
);
90 void def_pieces(char *sign
, char **top
, char **mid
, char **bot
, char **cen
);
91 void def_sizes(char *sign
, char *sizes
[]);
92 int def_brcost(int type
);
93 void def_piecesput(char *sign
, char *top
, char *mid
, char *bot
, char *cen
);
94 void def_sizesput(char *sign
, char *sizes
[]);
95 void def_brcostput(int type
, int cost
);
96 extern char *def_macros
[][2];
98 /* variable length string buffer */
100 char *s
; /* allocated buffer */
101 int sz
; /* buffer size */
102 int n
; /* length of the string stored in s */
105 void sbuf_init(struct sbuf
*sbuf
);
106 void sbuf_done(struct sbuf
*sbuf
);
107 char *sbuf_buf(struct sbuf
*sbuf
);
108 void sbuf_add(struct sbuf
*sbuf
, int c
);
109 void sbuf_append(struct sbuf
*sbuf
, char *s
);
110 void sbuf_printf(struct sbuf
*sbuf
, char *s
, ...);
111 void sbuf_cut(struct sbuf
*sbuf
, int n
);
112 int sbuf_len(struct sbuf
*sbuf
);
113 int sbuf_empty(struct sbuf
*sbuf
);
125 #define TS_MK(s, p) (((s) << 4) | (p))
126 #define TS_0(s) ((s) & 0x01) /* primed variant */
127 #define TS_MK0(s) ((s) | 0x01) /* make style primed */
128 #define TS_SZ(s) ((s) >> 4) /* character size */
129 #define TS_DX(s) ((s) == TS_D || (s) == TS_D0)
130 #define TS_TXT(s) ((s) & 0x02) /* text style */
132 int ts_sup(int style
);
133 int ts_sub(int style
);
134 int ts_denom(int style
);
135 int ts_num(int style
);
139 struct sbuf raw
; /* the contents */
140 int szreg
, szown
; /* number register holding box size */
141 int reg
; /* register holding the contents */
142 int atoms
; /* the number of atoms inserted */
143 int tbeg
, tcur
; /* type of the first and the last atoms */
144 int style
; /* tex style (TS_*) */
145 char *tomark
; /* register for saving box width */
148 struct box
*box_alloc(int szreg
, int at_pre
, int style
);
149 void box_free(struct box
*box
);
150 void box_puttext(struct box
*box
, int type
, char *s
, ...);
151 void box_putf(struct box
*box
, char *s
, ...);
152 int box_size(struct box
*box
, char *val
);
153 void box_merge(struct box
*box
, struct box
*sub
, int breakable
);
154 void box_sub(struct box
*box
, struct box
*sub
, struct box
*sup
);
155 void box_from(struct box
*box
, struct box
*lim
, struct box
*llim
, struct box
*ulim
);
156 void box_over(struct box
*box
, struct box
*num
, struct box
*denom
);
157 void box_sqrt(struct box
*box
, struct box
*sub
);
158 void box_bar(struct box
*box
);
159 void box_under(struct box
*box
);
160 void box_accent(struct box
*box
, char *c
);
161 void box_wrap(struct box
*box
, struct box
*sub
, char *left
, char *right
);
162 void box_move(struct box
*box
, int dy
, int dx
);
163 void box_gap(struct box
*box
, int n
);
164 char *box_buf(struct box
*box
);
165 char *box_toreg(struct box
*box
);
166 void box_vertspace(struct box
*box
);
167 int box_empty(struct box
*box
);
168 void box_markpos(struct box
*box
, char *regname
);
169 void box_vcenter(struct box
*box
, struct box
*sub
);
170 void box_pile(struct box
*box
, struct box
**pile
, int adj
, int rowspace
);
171 void box_matrix(struct box
*box
, int ncols
, struct box
*cols
[][NPILES
],
172 int *adj
, int colspace
, int rowspace
);
174 /* managing registers */
175 char *escarg(char *arg
);
182 char *nregname(int id
);
183 char *sregname(int id
);
184 void reg_reset(void);
186 /* eqn global variables */
187 extern int e_axisheight
;
188 extern int e_minimumsize
;
189 extern int e_overhang
;
190 extern int e_nulldelim
;
191 extern int e_scriptspace
;
192 extern int e_thinspace
;
193 extern int e_mediumspace
;
194 extern int e_thickspace
;
204 extern int e_supdrop
;
205 extern int e_subdrop
;
206 extern int e_xheight
;
207 extern int e_rulethickness
;
208 extern int e_bigopspacing1
;
209 extern int e_bigopspacing2
;
210 extern int e_bigopspacing3
;
211 extern int e_bigopspacing4
;
212 extern int e_bigopspacing5
;
213 extern int e_columnsep
;
214 extern int e_baselinesep
;
215 extern int e_bodyheight
;
216 extern int e_bodydepth
;
217 void def_set(char *name
, int val
);