6
// Atom representing fraction, with or without separation line.
7
internal class FractionAtom : Atom
9
private static TexAlignment CheckAlignment(TexAlignment alignment)
11
if (alignment == TexAlignment.Left || alignment == TexAlignment.Right)
14
return TexAlignment.Center;
17
private TexAlignment numeratorAlignment;
18
private TexAlignment denominatorAlignment;
20
private double lineThickness;
21
private TexUnit lineThicknessUnit;
23
private bool useDefaultThickness;
24
private double? lineRelativeThickness;
26
public FractionAtom(Atom numerator, Atom denominator, double relativeThickness,
27
TexAlignment numeratorAlignment, TexAlignment denominatorAlignment)
28
: this(numerator, denominator, true, numeratorAlignment, denominatorAlignment)
30
this.lineRelativeThickness = relativeThickness;
33
public FractionAtom(Atom numerator, Atom denominator, bool drawLine,
34
TexAlignment numeratorAlignment, TexAlignment denominatorAlignment)
35
: this(numerator, denominator, drawLine)
37
this.numeratorAlignment = CheckAlignment(numeratorAlignment);
38
this.denominatorAlignment = CheckAlignment(denominatorAlignment);
41
public FractionAtom(Atom numerator, Atom denominator, bool drawLine)
42
: this(numerator, denominator, drawLine, TexUnit.Pixel, 0d)
46
public FractionAtom(Atom numerator, Atom denominator, TexUnit unit, double thickness,
47
TexAlignment numeratorAlignment, TexAlignment denominatorAlignment)
48
: this(numerator, denominator, unit, thickness)
50
this.numeratorAlignment = CheckAlignment(numeratorAlignment);
51
this.denominatorAlignment = CheckAlignment(denominatorAlignment);
54
public FractionAtom(Atom numerator, Atom denominator, TexUnit unit, double thickness)
55
: this(numerator, denominator, false, unit, thickness)
59
protected FractionAtom(Atom numerator, Atom denominator, bool useDefaultThickness, TexUnit unit, double thickness)
61
SpaceAtom.CheckUnit(unit);
63
this.Type = TexAtomType.Inner;
64
this.Numerator = numerator;
65
this.Denominator = denominator;
66
this.numeratorAlignment = TexAlignment.Center;
67
this.denominatorAlignment = TexAlignment.Center;
68
this.useDefaultThickness = useDefaultThickness;
69
this.lineThicknessUnit = unit;
70
this.lineThickness = thickness;
79
public Atom Denominator
85
public override Box CreateBox(TexEnvironment environment)
87
var texFont = environment.TexFont;
88
var style = environment.Style;
90
// set thickness to default if default value should be used
92
var defaultLineThickness = texFont.GetDefaultLineThickness(style);
93
if (this.useDefaultThickness)
94
lineHeight = this.lineRelativeThickness.HasValue ? this.lineRelativeThickness.Value * defaultLineThickness :
97
lineHeight = new SpaceAtom(this.lineThicknessUnit, 0, this.lineThickness, 0).CreateBox(environment).Height;
99
// Create boxes for numerator and demoninator atoms, and make them of equal width.
100
var numeratorBox = this.Numerator == null ? StrutBox.Empty :
101
this.Numerator.CreateBox(environment.GetNumeratorStyle());
102
var denominatorBox = this.Denominator == null ? StrutBox.Empty :
103
this.Denominator.CreateBox(environment.GetDenominatorStyle());
105
if (numeratorBox.Width < denominatorBox.Width)
106
numeratorBox = new HorizontalBox(numeratorBox, denominatorBox.Width, numeratorAlignment);
108
denominatorBox = new HorizontalBox(denominatorBox, numeratorBox.Width, denominatorAlignment);
110
// Calculate preliminary shift-up and shift-down amounts.
111
double shiftUp, shiftDown;
112
if (style < TexStyle.Text)
114
shiftUp = texFont.GetNum1(style);
115
shiftDown = texFont.GetDenom1(style);
119
shiftDown = texFont.GetDenom2(style);
8
// Atom representing fraction, with or without separation line.
9
internal class FractionAtom : Atom
11
private static TexAlignment CheckAlignment(TexAlignment alignment)
13
if (alignment == TexAlignment.Left || alignment == TexAlignment.Right)
16
return TexAlignment.Center;
19
private TexAlignment numeratorAlignment;
20
private TexAlignment denominatorAlignment;
22
private double lineThickness;
23
private TexUnit lineThicknessUnit;
25
private bool useDefaultThickness;
26
private double? lineRelativeThickness;
28
public FractionAtom(Atom numerator, Atom denominator, double relativeThickness,
29
TexAlignment numeratorAlignment, TexAlignment denominatorAlignment)
30
: this(numerator, denominator, true, numeratorAlignment, denominatorAlignment)
32
this.lineRelativeThickness = relativeThickness;
35
public FractionAtom(Atom numerator, Atom denominator, bool drawLine,
36
TexAlignment numeratorAlignment, TexAlignment denominatorAlignment)
37
: this(numerator, denominator, drawLine)
39
this.numeratorAlignment = CheckAlignment(numeratorAlignment);
40
this.denominatorAlignment = CheckAlignment(denominatorAlignment);
43
public FractionAtom(Atom numerator, Atom denominator, bool drawLine)
44
: this(numerator, denominator, drawLine, TexUnit.Pixel, 0d)
48
public FractionAtom(Atom numerator, Atom denominator, TexUnit unit, double thickness,
49
TexAlignment numeratorAlignment, TexAlignment denominatorAlignment)
50
: this(numerator, denominator, unit, thickness)
52
this.numeratorAlignment = CheckAlignment(numeratorAlignment);
53
this.denominatorAlignment = CheckAlignment(denominatorAlignment);
56
public FractionAtom(Atom numerator, Atom denominator, TexUnit unit, double thickness)
57
: this(numerator, denominator, false, unit, thickness)
61
protected FractionAtom(Atom numerator, Atom denominator, bool useDefaultThickness, TexUnit unit, double thickness)
63
WpfMath.SpaceAtom.CheckUnit(unit);
65
this.Type = TexAtomType.Inner;
66
this.Numerator = numerator;
67
this.Denominator = denominator;
68
this.numeratorAlignment = TexAlignment.Center;
69
this.denominatorAlignment = TexAlignment.Center;
70
this.useDefaultThickness = useDefaultThickness;
71
this.lineThicknessUnit = unit;
72
this.lineThickness = thickness;
81
public Atom Denominator
87
public override Box CreateBox(WpfMath.TexEnvironment environment)
89
var texFont = environment.TexFont;
90
var style = environment.Style;
92
// set thickness to default if default value should be used
94
var defaultLineThickness = texFont.GetDefaultLineThickness(style);
95
if (this.useDefaultThickness)
96
lineHeight = this.lineRelativeThickness.HasValue ? this.lineRelativeThickness.Value * defaultLineThickness :
99
lineHeight = new WpfMath.SpaceAtom(this.lineThicknessUnit, 0, this.lineThickness, 0).CreateBox(environment).Height;
101
// Create boxes for numerator and demoninator atoms, and make them of equal width.
102
var numeratorBox = this.Numerator == null ? WpfMath.StrutBox.Empty :
103
this.Numerator.CreateBox(environment.GetNumeratorStyle());
104
var denominatorBox = this.Denominator == null ? WpfMath.StrutBox.Empty :
105
this.Denominator.CreateBox(environment.GetDenominatorStyle());
107
if (numeratorBox.Width < denominatorBox.Width)
108
numeratorBox = new WpfMath.HorizontalBox(numeratorBox, denominatorBox.Width, numeratorAlignment);
110
denominatorBox = new WpfMath.HorizontalBox(denominatorBox, numeratorBox.Width, denominatorAlignment);
112
// Calculate preliminary shift-up and shift-down amounts.
113
double shiftUp, shiftDown;
114
if (style < TexStyle.Text)
116
shiftUp = texFont.GetNum1(style);
117
shiftDown = texFont.GetDenom1(style);
121
shiftDown = texFont.GetDenom2(style);
123
shiftUp = texFont.GetNum2(style);
125
shiftUp = texFont.GetNum3(style);
128
// Create result box.
129
var resultBox = new WpfMath.VerticalBox();
131
// add box for numerator.
132
resultBox.Add(numeratorBox);
134
// Calculate clearance and adjust shift amounts.
135
var axis = texFont.GetAxisHeight(style);
120
137
if (lineHeight > 0)
121
shiftUp = texFont.GetNum2(style);
123
shiftUp = texFont.GetNum3(style);
126
// Create result box.
127
var resultBox = new VerticalBox();
129
// add box for numerator.
130
resultBox.Add(numeratorBox);
132
// Calculate clearance and adjust shift amounts.
133
var axis = texFont.GetAxisHeight(style);
137
// Draw fraction line.
139
// Calculate clearance amount.
141
if (style < TexStyle.Text)
142
clearance = 3 * lineHeight;
144
clearance = lineHeight;
146
// Adjust shift amounts.
147
var delta = lineHeight / 2;
148
var kern1 = shiftUp - numeratorBox.Depth - (axis + delta);
149
var kern2 = axis - delta - (denominatorBox.Height - shiftDown);
150
var delta1 = clearance - kern1;
151
var delta2 = clearance - kern2;
163
resultBox.Add(new StrutBox(0, kern1, 0, 0));
164
resultBox.Add(new HorizontalRule(lineHeight, numeratorBox.Width, 0));
165
resultBox.Add(new StrutBox(0, kern2, 0, 0));
169
// Do not draw fraction line.
171
// Calculate clearance amount.
173
if (style < TexStyle.Text)
174
clearance = 7 * defaultLineThickness;
176
clearance = 3 * defaultLineThickness;
178
// Adjust shift amounts.
179
var kern = shiftUp - numeratorBox.Depth - (denominatorBox.Height - shiftDown);
180
var delta = (clearance - kern) / 2;
188
resultBox.Add(new StrutBox(0, kern, 0, 0));
191
// add box for denominator.
192
resultBox.Add(denominatorBox);
194
// Adjust height and depth of result box.
195
resultBox.Height = shiftUp + numeratorBox.Height;
196
resultBox.Depth = shiftDown + denominatorBox.Depth;
139
// Draw fraction line.
141
// Calculate clearance amount.
143
if (style < TexStyle.Text)
144
clearance = 3 * lineHeight;
146
clearance = lineHeight;
148
// Adjust shift amounts.
149
var delta = lineHeight / 2;
150
var kern1 = shiftUp - numeratorBox.Depth - (axis + delta);
151
var kern2 = axis - delta - (denominatorBox.Height - shiftDown);
152
var delta1 = clearance - kern1;
153
var delta2 = clearance - kern2;
165
resultBox.Add(new WpfMath.StrutBox(0, kern1, 0, 0));
166
resultBox.Add(new WpfMath.HorizontalRule(lineHeight, numeratorBox.Width, 0));
167
resultBox.Add(new WpfMath.StrutBox(0, kern2, 0, 0));
171
// Do not draw fraction line.
173
// Calculate clearance amount.
175
if (style < TexStyle.Text)
176
clearance = 7 * defaultLineThickness;
178
clearance = 3 * defaultLineThickness;
180
// Adjust shift amounts.
181
var kern = shiftUp - numeratorBox.Depth - (denominatorBox.Height - shiftDown);
182
var delta = (clearance - kern) / 2;
190
resultBox.Add(new WpfMath.StrutBox(0, kern, 0, 0));
193
// add box for denominator.
194
resultBox.Add(denominatorBox);
196
// Adjust height and depth of result box.
197
resultBox.Height = shiftUp + numeratorBox.Height;
198
resultBox.Depth = shiftDown + denominatorBox.Depth;