;---- TeX drive ------ _fn<-"tex.cam"; TYPE TeX = TeXObj-list; TeXObj = TeXCmd | TeXTabRow; TeXCmd :: O: STR A: TeXArg-list; TeXTabRow :: R: TeXArg-list; TeXArg = STR | INT | TeXCmd | Opt | TeX ; Opt :: A: TeXArg; ENDTYPE TeXCons(c)=TeXCmd(c,<>); FUNC TeX2StrList(l:TeX): STR-list RETURN CONC(< (if is-TeXCmd(c) then TeXCmd2StrList(c) else TeXTabRow2StrList(c)) ^ <"\n"> | c <- l >); FUNC addSep(l:X-list,x:X):X-list RETURN if (length(l)<=1) then l else ^ CONC(< | a<- tl(l) >); FUNC TeXTabRow2StrList(x:TeXTabRow): STR-list RETURN CONC(addSep(< TeXArg2StrList(c) | c <- R(x) >, <"&">)); FUNC TeXArg2StrList(x:TeXArg): STR-list RETURN (if is-STR(x) then < x > else if is-INT(x) then < itoa(x) > else if is-TeXCmd(x) then TeXCmd2StrList(x) else TeX2StrList(x)); FUNC TeXCmd2StrList(c:TeXCmd): STR-list RETURN let (o=O(c), l=A(c)) in < strcat("\\",o) > ^ CONC(< if is-Opt(x) then <"[">^TeXArg2StrList(A(x))^<"]"> else <"{">^TeXArg2StrList(x)^<"}"> | x <- l >); ; ---- end of TeX drive ----- TYPE TabSchema = Field-list; Field :: A: Att SF: TabSchema; Att = STR; ENDTYPE FUNC width(f:Field):INT RETURN let (t=SF(f)) in if t==<> then 1 else SUM(< width(ff) | ff <- t>); FUNC depth(f:Field):INT RETURN let (t=SF(f)) in if t==<> then 1 else 1.+MAX({ depth(ff) | ff <- t}); FUNC level(t:TabSchema,l:INT):X-list RETURN if l==1 then < A(tt) | tt <- t > else CONC(); FUNC TeXdef(m:STR,l:TeX):TeXCmd RETURN TeXCmd(strcat("def\\",m),l); FUNC STRFF2TeX(ff:STR->STR):TeX RETURN < TeXdef(a,) | a <- dom(ff) >; t<- < Field("Disciplina",<>), Field("Alunos por turma (Nr.)", < Field("T",<>), Field("TP",<>), Field("P",<>) >), Field("Aprova,c~oes (%)", < Field("Relativamente ao nr. de inscritos",<>), Field("Relativamente ao nr. de avali'aveis" ,<>) >) >;