2
using System.Collections.Generic;
9
using TokenStream = IEnumerator<TexToken>;
11
public class TexWriter
13
public TexWriter(TextWriter writer)
15
this.TextWriter = writer;
16
this.IgnoreUnknownSymbols = true;
19
public TextWriter TextWriter
25
public bool IgnoreUnknownSymbols
31
public void Write(TokenStream tokenStream)
33
while (tokenStream.MoveNext())
35
var chr = GetShortSymbol(tokenStream.Current);
38
this.TextWriter.Write(chr);
41
var str = GetLongSymbol(tokenStream.Current);
44
this.TextWriter.Write('\\' + chr);
48
if (!this.IgnoreUnknownSymbols)
49
throw new WriterException(tokenStream.Current);
53
private char? GetShortSymbol(TexToken token)
57
case TexSymbolKind.RaiseToIndex:
59
case TexSymbolKind.LowerToIndex:
61
case TexSymbolKind.Prime:
63
case TexSymbolKind.Colon:
65
case TexSymbolKind.Comma:
67
case TexSymbolKind.Letter:
68
return (char)token.Value;
71
case TexSymbolKind.Equals:
73
case TexSymbolKind.LessThan:
75
case TexSymbolKind.GreaterThan:
80
case TexSymbolKind.Plus:
82
case TexSymbolKind.Minus:
84
case TexSymbolKind.Star:
86
case TexSymbolKind.Divide:
88
case TexSymbolKind.Factorial:
93
case TexSymbolKind.GroupOpen:
95
case TexSymbolKind.GroupClose:
97
case TexSymbolKind.RoundBracketOpen:
99
case TexSymbolKind.RoundBracketClose:
101
case TexSymbolKind.SquareBracketOpen:
103
case TexSymbolKind.SquareBracketClose:
105
case TexSymbolKind.ModulusBracket:
114
private string GetLongSymbol(TexToken token)
116
switch (token.Symbol)
118
case TexSymbolKind.Number:
119
var value = (double)token.Value;
120
if (double.IsPositiveInfinity(value))
123
return value.ToString();
124
case TexSymbolKind.Text:
125
return string.Format("text{{0}}", (string)token.Value);
126
case TexSymbolKind.GreekLetter:
127
return (string)token.Value;
130
case TexSymbolKind.CurlyBracketOpen:
132
case TexSymbolKind.CurlyBracketClose:
134
case TexSymbolKind.AngleBracketOpen:
136
case TexSymbolKind.AngleBracketClose:
138
case TexSymbolKind.FloorBracketOpen:
140
case TexSymbolKind.FloorBracketClose:
142
case TexSymbolKind.CeilingBracketOpen:
144
case TexSymbolKind.CeilingBracketClose:
146
case TexSymbolKind.NormBracket:
151
case TexSymbolKind.NotEquals:
153
case TexSymbolKind.DotEquals:
155
case TexSymbolKind.Approximates:
157
case TexSymbolKind.Equivalent:
159
case TexSymbolKind.LessThanOrEqualTo:
161
case TexSymbolKind.GreaterThanOrEqualTo:
163
case TexSymbolKind.MuchLessThan:
165
case TexSymbolKind.MuchGreaterThan:
167
case TexSymbolKind.Proportional:
169
case TexSymbolKind.Asymptotic:
171
case TexSymbolKind.Bowtie:
173
case TexSymbolKind.Models:
175
case TexSymbolKind.Precedes:
177
case TexSymbolKind.PrecedesOrEquals:
179
case TexSymbolKind.Succedes:
181
case TexSymbolKind.SuccedesOrEquals:
183
case TexSymbolKind.Congruent:
185
case TexSymbolKind.Similar:
187
case TexSymbolKind.SimilarOrEquals:
189
case TexSymbolKind.Perpendicular:
191
case TexSymbolKind.Middle:
193
case TexSymbolKind.Subset:
195
case TexSymbolKind.SubsetOrEqualTo:
197
case TexSymbolKind.Superset:
199
case TexSymbolKind.SupersetOrEqualTo:
201
case TexSymbolKind.SquareSubset:
203
case TexSymbolKind.SquareSubsetOrEqualTo:
205
case TexSymbolKind.SquareSuperset:
207
case TexSymbolKind.SquareSupersetOrEqualTo:
209
case TexSymbolKind.Member:
211
case TexSymbolKind.NotMember:
213
case TexSymbolKind.Contains:
215
case TexSymbolKind.NotContains:
217
case TexSymbolKind.Smile:
219
case TexSymbolKind.Frown:
221
case TexSymbolKind.VLineDash:
223
case TexSymbolKind.DashVLine:
228
case TexSymbolKind.PlusMinus:
230
case TexSymbolKind.MinusPlus:
232
case TexSymbolKind.Cross:
234
case TexSymbolKind.Dot:
236
case TexSymbolKind.Divide:
238
case TexSymbolKind.Over:
243
case TexSymbolKind.Fraction:
245
case TexSymbolKind.Binomial:
247
case TexSymbolKind.Root:
249
case TexSymbolKind.Minimum:
251
case TexSymbolKind.Maximum:
253
case TexSymbolKind.GreatestCommonDenominator:
255
case TexSymbolKind.LowestCommonMultiple:
257
case TexSymbolKind.Exponent:
259
case TexSymbolKind.Log:
261
case TexSymbolKind.NaturalLog:
263
case TexSymbolKind.Argument:
265
case TexSymbolKind.Limit:
267
case TexSymbolKind.LimitInferior:
269
case TexSymbolKind.LimitSuperior:
271
case TexSymbolKind.Sine:
273
case TexSymbolKind.Cosine:
275
case TexSymbolKind.Tangent:
277
case TexSymbolKind.Secant:
279
case TexSymbolKind.Cosecant:
281
case TexSymbolKind.Cotangent:
283
case TexSymbolKind.ArcSine:
285
case TexSymbolKind.ArcCosine:
287
case TexSymbolKind.ArcTangent:
289
case TexSymbolKind.ArcSecant:
291
case TexSymbolKind.ArcCosecant:
293
case TexSymbolKind.ArcCotangent:
295
case TexSymbolKind.HypSine:
297
case TexSymbolKind.HypCosine:
299
case TexSymbolKind.HypTangent:
301
case TexSymbolKind.HypSecant:
303
case TexSymbolKind.HypCosecant:
305
case TexSymbolKind.HypCotangent:
307
case TexSymbolKind.ArHypSine:
309
case TexSymbolKind.ArHypCosine:
311
case TexSymbolKind.ArHypTangent:
313
case TexSymbolKind.ArHypSecant:
315
case TexSymbolKind.ArHypCosecant:
317
case TexSymbolKind.ArHypCotangent:
319
case TexSymbolKind.InlineModulo:
321
case TexSymbolKind.IdentityModulo:
323
case TexSymbolKind.Sum:
325
case TexSymbolKind.Product:
327
case TexSymbolKind.Coproduct:
329
case TexSymbolKind.Integral:
331
case TexSymbolKind.DoubleIntegral:
333
case TexSymbolKind.TripleIntegral:
335
case TexSymbolKind.QuadrupleIntegral:
337
case TexSymbolKind.NtupleIntegral:
339
case TexSymbolKind.ClosedIntegral:
341
case TexSymbolKind.ClosedDoubleIntegral:
343
case TexSymbolKind.ClosedTripleIntegral:
345
case TexSymbolKind.ClosedQuadrupleIntegral:
347
case TexSymbolKind.ClosedNtupleIntegral:
349
case TexSymbolKind.BigOPlus:
351
case TexSymbolKind.BigOTimes:
353
case TexSymbolKind.BigODot:
355
case TexSymbolKind.BigCup:
357
case TexSymbolKind.BigCap:
359
case TexSymbolKind.BigCupPlus:
361
case TexSymbolKind.BigSquareCup:
363
case TexSymbolKind.BigSquareCap:
365
case TexSymbolKind.BigVee:
367
case TexSymbolKind.BigWedge:
372
case TexSymbolKind.Separator:
374
case TexSymbolKind.Left:
376
case TexSymbolKind.Right: