1:- module(tex, [
2 texparse/2,
3 tex_tokens/2,
4 tex_env/2,
5 filler/2]). 6
7:- encoding(utf8).
8
9term_expansion --> pac:expand_pac.
10
11:- use_module(pac(op)). 12
13 16
19
20texparse --> tex_tokens, !, tex_env.
22tex_tokens(X, Y) :- tex_tokens(Y, X, []).
24tex_env(X, Y) :- tex_env(Y, [], X, []), !.
26tex_tokens([]) --> "".
27tex_tokens(X) --> "\\\n", !, tex_tokens(X).
28tex_tokens(X) --> tex_token(X,Y), !, tex_tokens(Y).
30tex_token(X, Y) --> tex_cs(X, Y).
31tex_token(X, Y) --> tex_group(X, Y).
32tex_token(X, Y) --> tex_math(X, Y).
33tex_token(X, Y) --> tex_comment(X, Y).
34tex_token([C|X], X) --> [C].
35
37tex_cs([cs(Name)|X], X) --> "\\",
38 wl("[a-zA-Z]+", Name1),
39 {compound(Name1)},
40 {atom_codes(Name, Name1)}.
41tex_cs([cs(C)|X], X) --> "\\" , [C1], {atom_codes(C, [C1])}.
43tex_group([group(X)|Y], Y) --> "{", tex_tokens(X), "}".
44
46tex_math([ddol(X)|Y],Y) --> "$$", tex_tokens(X), "$$".
47tex_math([dol(X)|Y],Y) --> "$", tex_tokens(X), "$".
48
50tex_env(X, X) --> "".
51tex_env([group(X)|Y], Z) --> [group(G)],
52 {tex_env(G,X)},
53 tex_env(Y,Z).
54tex_env([env(Name,X)|Y], Z) --> [cs(begin)],
55 filler,
56 [group(T)],
57 tex_env(X, []),
58 [cs(end)],
59 filler,
60 [group(T)],
61 {atom_codes(Name, T)},
62 tex_env(Y,Z).
63tex_env([ddol(X)|Y], Z) --> [ddol(M)],
64 {tex_env(M, X)},
65 tex_env(Y, Z).
66tex_env([dol(X)|Y], Z) --> [dol(M)],
67 {tex_env(M, X)},
68 tex_env(Y, Z).
69tex_env([X|Y], Z) --> [X], tex_env(Y, Z).
70
([comment(X)|Y], Y) --> "%", wl("[^\n]*$", X).
75filler --> wl("[\s\t]*")