TeX in C
Explore TeX with modern c compiler.
box.h
浏览该文件的文档.
1 #pragma once
2 #ifndef INC_BOX_H
8 #define INC_BOX_H
9 #include "global.h"
10  // [type] Integer, Pointer, QuarterWord, Scaled, SmallNumber, HalfWord
11 #include "mem.h" // [var] mem, hi_mem_min; [macro] link, type, subtype
12 #include "texmath.h" // [macro] INF_BAD
13 #include "str.h" // [type] StrNumber
14 
19 #define type(x) (mem[(x)].hh.UU.U2.b0)
21 #define subtype(x) (mem[(x)].hh.UU.U2.b1)
22 
24 #define is_char_node(x) ((x) >= hi_mem_min)
25 
26 #ifdef BIG_CHARNODE
28 #define font(x) link(x + 1)
29 /* #define font(x) info(x+1) */
30 #else
31 #define font(x) type(x)
32 #endif // #ifdef BIG_CHARNODE
33 
35 #define character(x) subtype(x)
36 
37 #ifdef BIG_CHARNODE
38 #define CHAR_NODE_SIZE 2
39 #define font_ligchar(x) type(ligchar(x))
40 #define character_ligchar(x) subtype(ligchar(x))
41 #else
42 #define CHAR_NODE_SIZE 1
43 #define font_ligchar(x) font(ligchar(x))
44 #define character_ligchar(x) character(ligchar(x))
45 #endif // #ifdef BIG_CHARNODE
46 
47 
48 enum NodeType {
55 
61 
65 }; // enum NodeType
66 
68 #define boxnodesize 7
70 #define widthoffset 1
72 #define depthoffset 2
74 #define heightoffset 3
75 
77 #define width(x) mem[x + widthoffset].sc
79 #define depth(x) mem[x + depthoffset].sc
81 #define height(x) mem[x + heightoffset].sc
83 
84 #define shiftamount(x) mem[x + 4].sc
86 #define listoffset 5
88 #define listptr(x) link(x + listoffset)
90 #define glueorder(x) subtype(x + listoffset)
92 #define gluesign(x) type(x + listoffset)
93 
95 #define NORMAL 0
97 #define stretching 1
99 #define shrinking 2
101 #define glueoffset 6
103 #define glueset(x) mem[x + glueoffset].gr
104 
106 #define rulenodesize 4
108 #define nullflag (-1073741824L)
110 #define isrunning(x) ((x) == nullflag)
111 
112 
114 #define insnodesize 5
116 #define floatcost(x) mem[x + 1].int_
118 #define insptr(x) info(x + 4)
120 #define splittopptr(x) link(x + 4)
121 
123 #define smallnodesize 2
125 #define markptr(x) mem[x + 1].int_
126 
128 #define adjustptr markptr
129 
131 #define ligchar(x) ((x) + 1)
133 #define ligptr(x) link(ligchar(x))
134 
135 
137 #define replacecount subtype
139 #define prebreak llink
141 #define postbreak rlink
142 
143 
145 #define before 0
147 #define after 1
148 
150 #define precedesbreak(x) (type(x) < MATH_NODE)
152 #define nondiscardable(x) (type(x) < MATH_NODE)
153 
155 #define condmathglue 98
157 #define muglue 99
159 #define aleaders 100
161 #define cleaders 101
163 #define xleaders 102
165 #define glueptr llink
167 #define leaderptr rlink
168 
169 
171 #define gluespecsize 4
173 #define gluerefcount(x) link(x)
175 #define stretch(x) mem[x + 2].sc
177 #define shrink(x) mem[x + 3].sc
179 #define stretchorder(x) type(x)
181 #define shrinkorder(x) subtype(x)
187  FIL = 1,
189  FILLL
190 }; // [#150] enum InfinityOrder
191 
192 
194 #define explicit 1
196 #define acckern 2
197 
199 #define INF_PENALTY INF_BAD
201 #define EJECT_PENALTY (-INF_PENALTY)
203 #define penalty(x) mem[x + 1].int_
204 
205 
207 #define gluestretch(x) mem[x + glueoffset].sc
209 #define glueshrink shiftamount
211 #define spancount subtype
218 #define nodelistdisplay(x) (append_char('.'), shownodelist(x), flush_char()) // end group S173x198_P62x68
220 
224 // [#200] reference count preceding a token list
225 #define tokenrefcount(x) info(x) // end group S199x202_P69x70
227 
233 #define addtokenref(x) (tokenrefcount(x)++)
235 #define addglueref(x) (gluerefcount(x)++) // end group S203x206_P71x72
237 
238 
239 // box_display
241 extern Integer depth_threshold;
242 extern Integer breadth_max;
243 
244 // [box], tex, scan
245 extern Pointer new_null_box(void);
246 extern Pointer new_rule(void);
249 extern Pointer new_disc(void);
250 extern Pointer new_math(Scaled w, SmallNumber s);
251 extern Pointer new_spec(Pointer p);
253 extern Pointer new_glue(Pointer q);
255 extern Pointer new_kern(long w);
256 extern Pointer new_penalty(long m);
257 
258 // box_display
259 extern void shortdisplay(Pointer p);
260 extern void printspec(Integer p, StrNumber s);
261 extern void shownodelist(Integer p);
262 extern void showbox(HalfWord p);
263 
264 // box_destroy
265 extern void delete_token_ref(HalfWord p);
266 extern void delete_glue_ref(HalfWord p);
267 extern void flush_node_list(HalfWord p);
268 
269 // box_copy
270 extern HalfWord copynodelist(HalfWord p);
271 
272 #endif /* INC_BOX_H */
uint16_t QuarterWord
[p43#113]: QuarterWord(8=>16) .
Definition: tex_types.h:126
uint32_t HalfWord
[p43#113]: HalfWord(16=>32) .
Definition: tex_types.h:127
Pointer new_skip_param(SmallNumber n)
[#154] creates a glue node for one of the current glue parameters.
Definition: box.c:168
Pointer new_kern(long w)
[#156] creates a kern node having a given width.
Definition: box.c:180
InfinityOrder
[#150]: the orders of INFINITY (normal, fil, fill, or filll) corresponding to the stretch and shrink ...
Definition: box.h:186
Pointer new_glue(Pointer q)
[#153] argument points to a glue specification.
Definition: box.c:149
Pointer new_rule(void)
[#139]
Definition: box.c:38
Pointer new_lig_item(QuarterWord c)
[#144] returns a two-word node having a given character field.
Definition: box.c:73
Pointer new_disc(void)
[#145] creates an empty disc node.
Definition: box.c:85
Pointer new_spec(Pointer p)
[#151] duplicates a glue specification.
Definition: box.c:117
Pointer new_null_box(void)
[#136] creates a new box node.
Definition: box.c:18
Pointer new_penalty(long m)
[#158]
Definition: box.c:191
NodeType
Definition: box.h:48
Pointer new_math(Scaled w, SmallNumber s)
[#147] A math node, which occurs only in horizontal lists, appears before and after mathematical form...
Definition: box.c:104
Pointer new_param_glue(SmallNumber n)
[#152] creates a glue node for a given parameter identified by its code number;
Definition: box.c:133
Pointer new_ligature(QuarterWord f, QuarterWord c, Pointer q)
[#144] creates a ligature node having given contents of the font, character, and lig_ptr fields.
Definition: box.c:55
@ FILL
second-order INFINITY
Definition: box.h:188
@ FILLL
third-order INFINITY
Definition: box.h:189
@ FIL
first-order INFINITY
Definition: box.h:187
@ ADJUST_NODE
#142: type of an adjust node
Definition: box.h:54
@ MATH_NODE
#147: type of a math node
Definition: box.h:59
@ LIGATURE_NODE
#143: type of a ligature node
Definition: box.h:56
@ UNSET_NODE
#159: type for an unset node
Definition: box.h:64
@ GLUE_NODE
#150: number of words to allocate for a glue specification
Definition: box.h:60
@ WHATSIT_NODE
#146: type of special extension nodes
Definition: box.h:58
@ RULE_NODE
#138: type of rule nodes
Definition: box.h:51
@ KERN_NODE
#155: type of a kern node
Definition: box.h:62
@ PENALTY_NODE
#157: type of a penalty node
Definition: box.h:63
@ VLIST_NODE
#137: type of vlist nodes
Definition: box.h:50
@ INS_NODE
#140: type of insertion nodes
Definition: box.h:52
@ HLIST_NODE
#135: type of hlist nodes
Definition: box.h:49
@ MARK_NODE
#141: type of a mark node
Definition: box.h:53
@ DISC_NODE
#145: type of a discretionary node
Definition: box.h:57
void showbox(HalfWord p)
[#198]
Definition: box_display.c:573
Integer font_in_short_display
[#173] an internal font number.
Definition: box_display.c:17
void printspec(Integer p, StrNumber s)
[#178] prints a glue specification.
Definition: box_display.c:149
Integer depth_threshold
[#181] maximum nesting depth in box displays.
Definition: box_display.c:19
void shownodelist(Integer p)
[#182] prints a node list symbolically.
Definition: box_display.c:170
Integer breadth_max
[#181] maximum number of items shown at the same list level.
Definition: box_display.c:21
void shortdisplay(Pointer p)
[#174] prints highlights of list p.
Definition: box_display.c:25
void delete_token_ref(HalfWord p)
Definition: box_destroy.c:16
void flush_node_list(HalfWord p)
Definition: box_destroy.c:36
void delete_glue_ref(HalfWord p)
Definition: box_destroy.c:31
HalfWord copynodelist(HalfWord p)
Definition: box_copy.c:12
uint_fast32_t StrNumber
Definition: str.h:73
int64_t Integer
Integer(64) =
Definition: tex_types.h:42
Integer Scaled
[p38#101]: Scaled::Integer(64) = we need Pascal's Integer(32/64), dependent upon the bit size of the...
Definition: tex_types.h:106
size_t Pointer
Pointer::size_t(64), a flag or a location in mem or eqtb.
Definition: tex_types.h:45
UChar SmallNumber
[p38#101]: SmallNumber::UChar(8) = [0, 255] only need: (6bit)[0, 63] .
Definition: tex_types.h:112