Index: math/tex.mli =================================================================== --- math/tex.mli (revision 17364) +++ math/tex.mli (arbetskopia) @@ -4,11 +4,15 @@ | TEX_FQ of t * t * t | TEX_DQ of t * t | TEX_UQ of t * t + | TEX_FQN of t * t + | TEX_DQN of t + | TEX_UQN of t | TEX_LR of Render_info.t * Render_info.t * t list | TEX_BOX of string * string | TEX_BIG of string * Render_info.t | TEX_FUN1 of string * t | TEX_FUN2 of string * t * t + | TEX_FUN2nb of string * t * t | TEX_INFIX of string * t list * t list | TEX_FUN2sq of string * t * t | TEX_FUN1hl of string * (string * string) * t Index: math/parser.mly =================================================================== --- math/parser.mly (revision 17364) +++ math/parser.mly (arbetskopia) @@ -5,17 +5,16 @@ let sq_close_ri = HTMLABLEC(FONT_UFH,"]", "]") %} %token LITERAL DELIMITER -%token FUN_AR2 FUN_INFIX FUN_AR1 DECL FUN_AR1opt BIG +%token FUN_AR2 FUN_INFIX FUN_AR1 DECL FUN_AR1opt BIG FUN_AR2nb %token BOX %token FUN_AR1hl %token FUN_AR1hf DECLh %token Tex.t->string*string*string)> FUN_AR2h %token Tex.t list->string*string*string)> FUN_INFIXh %token EOF CURLY_OPEN CURLY_CLOSE SUB SUP SQ_CLOSE NEXT_CELL NEXT_ROW -%token BEGIN__MATRIX BEGIN_PMATRIX BEGIN_BMATRIX BEGIN_BBMATRIX BEGIN_VMATRIX BEGIN_VVMATRIX BEGIN_CASES BEGIN_ARRAY -%token END__MATRIX END_PMATRIX END_BMATRIX END_BBMATRIX END_VMATRIX END_VVMATRIX END_CASES END_ARRAY -%token LEFT RIGHT - +%token BEGIN__MATRIX BEGIN_PMATRIX BEGIN_BMATRIX BEGIN_BBMATRIX BEGIN_VMATRIX BEGIN_VVMATRIX BEGIN_CASES BEGIN_ARRAY BEGIN_ALIGN BEGIN_ALIGNAT BEGIN_SMALLMATRIX +%token END__MATRIX END_PMATRIX END_BMATRIX END_BBMATRIX END_VMATRIX END_VVMATRIX END_CASES END_ARRAY END_ALIGN END_ALIGNAT END_SMALLMATRIX +%token LEFT RIGHT %type tex_expr %start tex_expr @@ -54,14 +53,25 @@ lit { $1 } | lit_dq { let base,downi = $1 in TEX_DQ(base,downi) } | lit_uq { let base,upi = $1 in TEX_UQ(base,upi)} + | lit_dqn { TEX_DQN($1) } + | lit_uqn { TEX_UQN($1) } | lit_fq { $1 } + lit_fq: lit_dq SUP lit { let base,downi = $1 in TEX_FQ(base,downi,$3) } | lit_uq SUB lit { let base,upi = $1 in TEX_FQ(base,$3,upi) } + | lit_dqn SUP lit { TEX_FQN($1, $3) } + lit_uq: lit SUP lit { $1,$3 } lit_dq: lit SUB lit { $1,$3 } +lit_uqn: + SUP lit { $2 } +lit_dqn: + SUB lit { $2 } + + left: LEFT DELIMITER { $2 } | LEFT SQ_CLOSE { sq_close_ri } @@ -79,6 +89,7 @@ | FUN_AR1hf lit { let t,h=$1 in TEX_FUN1hf(t,h,$2) } | FUN_AR1opt expr_nosqc SQ_CLOSE lit { TEX_FUN2sq($1,TEX_CURLY $2,$4) } | FUN_AR2 lit lit { TEX_FUN2($1,$2,$3) } + | FUN_AR2nb lit lit { TEX_FUN2nb($1,$2,$3) } | FUN_AR2h lit lit { let t,h=$1 in TEX_FUN2h(t,h,$2,$3) } | BOX { let bt,s = $1 in TEX_BOX (bt,s) } | CURLY_OPEN expr CURLY_CLOSE @@ -94,6 +105,9 @@ | BEGIN_VMATRIX matrix END_VMATRIX { TEX_MATRIX ("vmatrix", $2) } | BEGIN_VVMATRIX matrix END_VVMATRIX { TEX_MATRIX ("Vmatrix", $2) } | BEGIN_ARRAY matrix END_ARRAY { TEX_MATRIX ("array", $2) } + | BEGIN_ALIGN matrix END_ALIGN { TEX_MATRIX ("aligned", $2) } + | BEGIN_ALIGNAT matrix END_ALIGNAT { TEX_MATRIX ("alignedat", $2) } + | BEGIN_SMALLMATRIX matrix END_SMALLMATRIX { TEX_MATRIX ("smallmatrix", $2) } | BEGIN_CASES matrix END_CASES { TEX_MATRIX ("cases", $2) } matrix: line { [$1] } Index: math/texvc_test.ml =================================================================== --- math/texvc_test.ml (revision 17364) +++ math/texvc_test.ml (arbetskopia) @@ -8,7 +8,6 @@ let line = input_line stdin in (try let tree = Parser.tex_expr lexer_token_safe (Lexing.from_string line) in - let out = Util.mapjoin Texutil.render_tex tree in (match Html.render tree with Some _ -> print_string "$^\n" | None -> print_string "$_\n"; Index: math/lexer.mll =================================================================== --- math/lexer.mll (revision 17364) +++ math/lexer.mll (arbetskopia) @@ -16,6 +16,10 @@ rule token = parse space + { token lexbuf } + | "\\text" space * '{' boxchars + '}' + { Texutil.tex_use_ams (); let str = Lexing.lexeme lexbuf in + let n = String.index str '{' + 1 in + BOX ("\\text", String.sub str n (String.length str - n - 1)) } | "\\mbox" space * '{' aboxchars + '}' { let str = Lexing.lexeme lexbuf in let n = String.index str '{' + 1 in @@ -52,6 +56,8 @@ | delimiter_uf_op { let str = Lexing.lexeme lexbuf in DELIMITER (MHTMLABLEC (FONT_UFH, str," "^str^" ",MO,str)) } | "\\" alpha + { Texutil.find (Lexing.lexeme lexbuf) } | "\\sqrt" space * "[" { FUN_AR1opt "\\sqrt" } + | "\\xleftarrow" space * "[" { Texutil.tex_use_ams(); FUN_AR1opt "\\xleftarrow" } + | "\\xrightarrow" space * "[" { Texutil.tex_use_ams(); FUN_AR1opt "\\xrightarrow" } | "\\," { LITERAL (HTMLABLE (FONT_UF, "\\,"," ")) } | "\\ " { LITERAL (HTMLABLE (FONT_UF, "\\ "," ")) } | "\\;" { LITERAL (HTMLABLE (FONT_UF, "\\;"," ")) } @@ -79,6 +85,12 @@ | "\\end{Vmatrix}" { END_VVMATRIX } | "\\begin{array}" { Texutil.tex_use_ams(); BEGIN_ARRAY } | "\\end{array}" { END_ARRAY } + | "\\begin{align}" { Texutil.tex_use_ams(); BEGIN_ALIGN } + | "\\end{align}" { END_ALIGN } + | "\\begin{alignat}" { Texutil.tex_use_ams(); BEGIN_ALIGNAT } + | "\\end{alignat}" { END_ALIGNAT } + | "\\begin{smallmatrix}" { Texutil.tex_use_ams(); BEGIN_SMALLMATRIX } + | "\\end{smallmatrix}" { END_SMALLMATRIX } | "\\begin{cases}" { Texutil.tex_use_ams(); BEGIN_CASES } | "\\end{cases}" { END_CASES } | '>' { LITERAL (HTMLABLEC(FONT_UFH,">"," > ")) } Index: math/texutil.ml =================================================================== --- math/texutil.ml (revision 17364) +++ math/texutil.ml (arbetskopia) @@ -14,12 +14,16 @@ TEX_FQ (a,b,c) -> (render_tex a) ^ "_{" ^ (render_tex b) ^ "}^{" ^ (render_tex c) ^ "}" | TEX_DQ (a,b) -> (render_tex a) ^ "_{" ^ (render_tex b) ^ "}" | TEX_UQ (a,b) -> (render_tex a) ^ "^{" ^ (render_tex b) ^ "}" + | TEX_FQN (a,b) -> "_{" ^ (render_tex a) ^ "}^{" ^ (render_tex b) ^ "}" + | TEX_DQN (a) -> "_{" ^ (render_tex a) ^ "}" + | TEX_UQN (a) -> "^{" ^ (render_tex a) ^ "}" | TEX_LITERAL s -> tex_part s | TEX_FUN1 (f,a) -> "{" ^ f ^ " " ^ (render_tex a) ^ "}" | TEX_FUN1hl (f,_,a) -> "{" ^ f ^ " " ^ (render_tex a) ^ "}" | TEX_FUN1hf (f,_,a) -> "{" ^ f ^ " " ^ (render_tex a) ^ "}" | TEX_DECLh (f,_,a) -> "{" ^ f ^ "{" ^ (mapjoin render_tex a) ^ "}}" | TEX_FUN2 (f,a,b) -> "{" ^ f ^ " " ^ (render_tex a) ^ (render_tex b) ^ "}" + | TEX_FUN2nb (f,a,b) -> f ^ (render_tex a) ^ (render_tex b) | TEX_FUN2h (f,_,a,b) -> "{" ^ f ^ " " ^ (render_tex a) ^ (render_tex b) ^ "}" | TEX_FUN2sq (f,a,b) -> "{" ^ f ^ "[ " ^ (render_tex a) ^ "]" ^ (render_tex b) ^ "}" | TEX_CURLY (tl) -> "{" ^ (mapjoin render_tex tl) ^ "}" @@ -30,6 +34,7 @@ | TEX_MATRIX (t,rows) -> "{\\begin{"^t^"}"^(mapjoine "\\\\" (mapjoine "&" (mapjoin render_tex)) rows)^"\\end{"^t^"}}" | TEX_LR (l,r,tl) -> "\\left "^(tex_part l)^(mapjoin render_tex tl)^"\\right "^(tex_part r) + (* Dynamic loading*) type encoding_t = LATIN1 | LATIN2 | UTF8 @@ -158,6 +163,8 @@ | "\\lrcorner" -> (tex_use_ams (); DELIMITER (TEX_ONLY "\\lrcorner ")) | "\\twoheadleftarrow" -> (tex_use_ams (); DELIMITER (TEX_ONLY "\\twoheadleftarrow ")) | "\\twoheadrightarrow" -> (tex_use_ams (); DELIMITER (TEX_ONLY "\\twoheadrightarrow ")) + | "\\xleftarrow" -> (tex_use_ams (); FUN_AR1 "\\xleftarrow ") + | "\\xrightarrow" -> (tex_use_ams (); FUN_AR1 "\\xrightarrow ") | "\\rightleftharpoons" -> DELIMITER (TEX_ONLY "\\rightleftharpoons ") | "\\leftrightarrow" -> LITERAL (HTMLABLE (FONT_UF, "\\leftrightarrow ", "↔")) | "\\lrarr" -> LITERAL (HTMLABLE (FONT_UF, "\\leftrightarrow ", "↔")) @@ -412,6 +419,7 @@ | "\\Box" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\Box ")) | "\\nleq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\nleq ")) | "\\upharpoonright" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\upharpoonright ")) + | "\\restriction" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\upharpoonright ")) | "\\upharpoonleft" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\upharpoonleft ")) | "\\downharpoonright" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\downharpoonright ")) | "\\downharpoonleft" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\downharpoonleft ")) @@ -466,9 +474,16 @@ | "\\not" -> LITERAL (TEX_ONLY "\\not ") | "\\choose" -> FUN_INFIX "\\choose " | "\\atop" -> FUN_INFIX "\\atop " - | "\\binom" -> FUN_AR2 "\\binom " + | "\\binom" -> (tex_use_ams (); FUN_AR2 "\\binom ") + | "\\dbinom" -> (tex_use_ams (); FUN_AR2 "\\dbinom ") + | "\\tbinom" -> (tex_use_ams (); FUN_AR2 "\\tbinom ") | "\\stackrel" -> FUN_AR2 "\\stackrel " + | "\\sideset" -> (tex_use_ams (); FUN_AR2nb "\\sideset ") + | "\\underset" -> (tex_use_ams (); FUN_AR2 "\\underset ") + | "\\overset" -> (tex_use_ams (); FUN_AR2 "\\overset ") | "\\frac" -> FUN_AR2h ("\\frac ", fun num den -> Html.html_render [num], "
", Html.html_render [den]) + | "\\dfrac" -> (tex_use_ams () ; FUN_AR2 "\\dfrac ") + | "\\tfrac" -> (tex_use_ams () ; FUN_AR2h ("\\tfrac ", fun num den -> Html.html_render [num], "
", Html.html_render [den])) | "\\cfrac" -> (tex_use_ams (); FUN_AR2h ("\\cfrac ", fun num den -> Html.html_render [num], "
", Html.html_render [den])) | "\\over" -> FUN_INFIXh ("\\over ", fun num den -> Html.html_render num, "
", Html.html_render den) | "\\sqrt" -> FUN_AR1 "\\sqrt " @@ -491,6 +506,188 @@ | "\\Big" -> BIG "\\Big " | "\\bigg" -> BIG "\\bigg " | "\\Bigg" -> BIG "\\Bigg " + | "\\bigl" -> (tex_use_ams ();BIG "\\bigl ") + | "\\bigr" -> (tex_use_ams ();BIG "\\bigr ") + | "\\Bigl" -> (tex_use_ams ();BIG "\\Bigl ") + | "\\Bigr" -> (tex_use_ams ();BIG "\\Bigr ") + | "\\biggl" -> (tex_use_ams ();BIG "\\biggl ") + | "\\biggr" -> (tex_use_ams ();BIG "\\biggr ") + | "\\Biggl" -> (tex_use_ams ();BIG "\\Biggl ") + | "\\Biggr" -> (tex_use_ams ();BIG "\\Biggr ") + | "\\vartriangle" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\vartriangle ")) + | "\\triangledown" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\triangledown ")) + | "\\lozenge" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\lozenge ")) + | "\\circledS" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\circledS ")) + | "\\measuredangle" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\measuredangle ")) + | "\\nexists" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\nexists ")) + | "\\Bbbk" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\Bbbk ")) + | "\\backprime" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\backprime ")) + | "\\blacktriangle" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\blacktriangle ")) + | "\\blacktriangledown"-> (tex_use_ams (); LITERAL (TEX_ONLY "\\blacktriangledown ")) + | "\\blacksquare" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\blacksquare ")) + | "\\blacklozenge" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\blacklozenge ")) + | "\\bigstar" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\bigstar ")) + | "\\sphericalangle" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\sphericalangle ")) + | "\\diagup" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\diagup ")) + | "\\diagdown" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\diagdown ")) + | "\\dotplus" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\dotplus ")) + | "\\Cap" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\Cap ")) + | "\\doublecap" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\Cap ")) + | "\\Cup" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\Cup ")) + | "\\doublecup" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\Cup ")) + | "\\barwedge" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\barwedge ")) + | "\\veebar" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\veebar ")) + | "\\doublebarwedge" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\doublebarwedge ")) + | "\\boxminus" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\boxminus ")) + | "\\boxtimes" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\boxtimes ")) + | "\\boxdot" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\boxdot ")) + | "\\boxplus" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\boxplus ")) + | "\\divideontimes" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\divideontimes ")) + | "\\ltimes" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\ltimes ")) + | "\\rtimes" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\rtimes ")) + | "\\leftthreetimes" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\leftthreetimes ")) + | "\\rightthreetimes" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\rightthreetimes ")) + | "\\curlywedge" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\curlywedge ")) + | "\\curlyvee" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\curlyvee ")) + | "\\circleddash" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\circleddash ")) + | "\\circledast" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\circledast ")) + | "\\circledcirc" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\circledcirc ")) + | "\\centerdot" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\centerdot ")) + | "\\intercal" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\intercal ")) + | "\\leqq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\leqq ")) + | "\\leqslant" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\leqslant ")) + | "\\eqslantless" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\eqslantless ")) + | "\\lessapprox" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\lessapprox ")) + | "\\approxeq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\approxeq ")) + | "\\lessdot" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\lessdot ")) + | "\\lll" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\lll ")) + | "\\lessgtr" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\lessgtr ")) + | "\\lesseqgtr" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\lesseqgtr ")) + | "\\lesseqqgtr" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\lesseqqgtr ")) + | "\\doteqdot" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\doteqdot ")) + | "\\Doteq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\doteqdot ")) + | "\\risingdotseq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\risingdotseq ")) + | "\\fallingdotseq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\fallingdotseq ")) + | "\\backsim" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\backsim ")) + | "\\backsimeq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\backsimeq ")) + | "\\subseteqq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\subseteqq ")) + | "\\Subset" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\Subset ")) + | "\\preccurlyeq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\preccurlyeq ")) + | "\\curlyeqprec" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\curlyeqprec ")) + | "\\precsim" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\precsim ")) + | "\\precapprox" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\precapprox ")) + | "\\vartriangleleft" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\vartriangleleft ")) + | "\\Vvdash" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\Vvdash ")) + | "\\bumpeq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\bumpeq ")) + | "\\Bumpeq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\Bumpeq ")) + | "\\geqq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\geqq ")) + | "\\geqslant" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\geqslant ")) + | "\\eqslantgtr" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\eqslantgtr ")) + | "\\gtrsim" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\gtrsim ")) + | "\\gtrapprox" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\gtrapprox ")) + | "\\eqsim" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\eqsim ")) + | "\\gtrdot" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\gtrdot ")) + | "\\ggg" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\ggg ")) + | "\\gggtr" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\ggg ")) + | "\\gtrless" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\gtrless ")) + | "\\gtreqless" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\gtreqless ")) + | "\\gtreqqless" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\gtreqqless ")) + | "\\eqcirc" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\eqcirc ")) + | "\\circeq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\circeq ")) + | "\\triangleq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\triangleq ")) + | "\\thicksim" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\thicksim ")) + | "\\thickapprox" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\thickapprox ")) + | "\\supseteqq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\supseteqq ")) + | "\\Supset" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\Supset ")) + | "\\succcurlyeq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\succcurlyeq ")) + | "\\curlyeqsucc" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\curlyeqsucc ")) + | "\\succsim" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\succsim ")) + | "\\succapprox" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\succapprox ")) + | "\\vartriangleright" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\vartriangleright ")) + | "\\shortmid" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\shortmid ")) + | "\\shortparallel" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\shortparallel ")) + | "\\between" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\between ")) + | "\\pitchfork" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\pitchfork ")) + | "\\varpropto" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\varpropto ")) + | "\\blacktriangleleft"-> (tex_use_ams (); LITERAL (TEX_ONLY "\\blacktriangleleft ")) + | "\\therefore" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\therefore ")) + | "\\backepsilon" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\backepsilon ")) + | "\\blacktriangleright"-> (tex_use_ams (); LITERAL (TEX_ONLY "\\blacktriangleright ")) + | "\\because" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\because ")) + | "\\nleqslant" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\nleqslant ")) + | "\\nleqq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\nleqq ")) + | "\\lneq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\lneq ")) + | "\\lneqq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\lneqq ")) + | "\\lvertneqq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\lvertneqq ")) + | "\\lnsim" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\lnsim ")) + | "\\lnapprox" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\lnapprox ")) + | "\\nprec" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\nprec ")) + | "\\npreceq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\npreceq ")) + | "\\precneqq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\precneqq ")) + | "\\precnsim" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\precnsim ")) + | "\\precnapprox" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\precnapprox ")) + | "\\nsim" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\nsim ")) + | "\\nshortmid" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\nshortmid ")) + | "\\nvdash" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\nvdash ")) + | "\\nVdash" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\nVdash ")) + | "\\ntriangleleft" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\ntriangleleft ")) + | "\\ntrianglelefteq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\ntrianglelefteq ")) + | "\\nsubseteq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\nsubseteq ")) + | "\\nsubseteqq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\nsubseteqq ")) + | "\\varsubsetneq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\varsubsetneq ")) + | "\\subsetneqq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\subsetneqq ")) + | "\\varsubsetneqq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\varsubsetneqq ")) + | "\\ngtr" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\ngtr ")) + | "\\ngeqslant" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\ngeqslant ")) + | "\\ngeqq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\ngeqq ")) + | "\\gneq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\gneq ")) + | "\\gneqq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\gneqq ")) + | "\\gvertneqq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\gvertneqq ")) + | "\\gnsim" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\gnsim ")) + | "\\gnapprox" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\gnapprox ")) + | "\\nsucc" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\nsucc ")) + | "\\nsucceq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\nsucceq ")) + | "\\succneqq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\succneqq ")) + | "\\succnsim" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\succnsim ")) + | "\\succnapprox" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\succnapprox ")) + | "\\ncong" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\ncong ")) + | "\\nshortparallel" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\nshortparallel ")) + | "\\nparallel" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\nparallel ")) + | "\\nvDash" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\nvDash ")) + | "\\nVDash" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\nVDash ")) + | "\\ntriangleright" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\ntriangleright ")) + | "\\ntrianglerighteq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\ntrianglerighteq ")) + | "\\nsupseteq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\nsupseteq ")) + | "\\nsupseteqq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\nsupseteqq ")) + | "\\varsupsetneq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\varsupsetneq ")) + | "\\supsetneqq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\supsetneqq ")) + | "\\varsupsetneqq" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\varsupsetneqq ")) + | "\\leftleftarrows" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\leftleftarrows ")) + | "\\leftrightarrows" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\leftrightarrows ")) + | "\\Lleftarrow" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\Lleftarrow ")) + | "\\leftarrowtail" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\leftarrowtail ")) + | "\\looparrowleft" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\looparrowleft ")) + | "\\leftrightharpoons"-> (tex_use_ams (); LITERAL (TEX_ONLY "\\leftrightharpoons ")) + | "\\curvearrowleft" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\curvearrowleft ")) + | "\\circlearrowleft" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\circlearrowleft ")) + | "\\Lsh" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\Lsh ")) + | "\\upuparrows" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\upuparrows ")) + | "\\rightrightarrows" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\rightrightarrows ")) + | "\\rightleftarrows" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\rightleftarrows ")) + | "\\Rrightarrow" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\Rrightarrow ")) + | "\\rightarrowtail" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\rightarrowtail ")) + | "\\looparrowright" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\looparrowright ")) + | "\\curvearrowright" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\curvearrowright ")) + | "\\circlearrowright" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\circlearrowright ")) + | "\\Rsh" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\Rsh ")) + | "\\downdownarrows" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\downdownarrows ")) + | "\\multimap" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\multimap ")) + | "\\leftrightsquigarrow"-> (tex_use_ams (); LITERAL (TEX_ONLY "\\leftrightsquigarrow ")) + | "\\rightsquigarrow" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\rightsquigarrow ")) + | "\\nLeftarrow" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\nLeftarrow ")) + | "\\nleftrightarrow" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\nleftrightarrow ")) + | "\\nRightarrow" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\nRightarrow ")) + | "\\nLeftrightarrow" -> (tex_use_ams (); LITERAL (TEX_ONLY "\\nLeftrightarrow ")) | "\\mathit" -> (tex_use_ams (); FUN_AR1hf ("\\mathit ", FONTFORCE_IT)) | "\\mathrm" -> (tex_use_ams (); FUN_AR1hf ("\\mathrm ", FONTFORCE_RM)) | "\\mathop" -> (tex_use_ams (); FUN_AR1 "\\mathop ") @@ -503,6 +700,7 @@ | "\\mathbb" -> (tex_use_ams (); FUN_AR1 "\\mathbb ") | "\\mathfrak" -> (tex_use_ams (); FUN_AR1 "\\mathfrak ") | "\\operatorname" -> (tex_use_ams (); FUN_AR1 "\\operatorname ") + | "\\text" -> raise (Failure "malformatted \\text") | "\\mbox" -> raise (Failure "malformatted \\mbox") | "\\vbox" -> raise (Failure "malformatted \\vbox") | "\\hbox" -> raise (Failure "malformatted \\hbox") Index: math/html.ml =================================================================== --- math/html.ml (revision 17364) +++ math/html.ml (arbetskopia) @@ -47,10 +47,17 @@ match html_render_size ctx a with true, s -> raise Too_difficult_for_html | false, s -> s^""^bs^""^cs^"")^html_render_flat ctx r) + | TEX_DQN (a)::r -> (html_liberal (); + let bs = html_render_flat ctx [a] in ""^bs^"")^html_render_flat ctx r + | TEX_UQN (a)::r -> (html_liberal (); + let bs = html_render_flat ctx [a] in ""^bs^"")^html_render_flat ctx r + | TEX_FQN (a,b)::r -> (html_liberal (); + (let bs = html_render_flat ctx [a] in let cs = html_render_flat ctx [b] in ""^bs^""^cs^"")^html_render_flat ctx r) | TEX_BOX (_,s)::r -> s^html_render_flat ctx r | TEX_LITERAL (TEX_ONLY _)::_ -> raise Too_difficult_for_html | TEX_FUN1 _::_ -> raise Too_difficult_for_html | TEX_FUN2 _::_ -> raise Too_difficult_for_html + | TEX_FUN2nb _::_ -> raise Too_difficult_for_html | TEX_FUN2h _::_ -> raise Too_difficult_for_html | TEX_FUN2sq _::_ -> raise Too_difficult_for_html | TEX_INFIX _::_ -> raise Too_difficult_for_html @@ -73,16 +80,21 @@ | TEX_INFIXh (_,f,a,b)::r -> (html_liberal (); (f a b)::html_render_deep ctx r) | TEX_CURLY ls::r -> html_render_deep ctx (ls @ r) | TEX_DQ (a,b)::r -> (let bs = html_render_flat ctx [b] in match html_render_size ctx a with - true, s -> "",""^s^"",bs + true, s -> "",""^s^"",bs | false, s -> "",(s^""^bs^""),"")::html_render_deep ctx r | TEX_UQ (a,b)::r -> (let bs = html_render_flat ctx [b] in match html_render_size ctx a with - true, s -> bs,""^s^"","" + true, s -> bs,""^s^"","" | false, s -> "",(s^""^bs^""),"")::html_render_deep ctx r | TEX_FQ (a,b,c)::r -> (html_liberal (); (let bs = html_render_flat ctx [b] in let cs = html_render_flat ctx [c] in match html_render_size ctx a with - true, s -> (cs,""^s^"",bs) + true, s -> (cs,""^s^"",bs) | false, s -> ("",(s^""^bs^""^cs^""),""))::html_render_deep ctx r) + | TEX_DQN (a)::r -> (let bs = html_render_flat ctx [a] in "",(""^bs^""),"")::html_render_deep ctx r + | TEX_UQN (a)::r -> (let bs = html_render_flat ctx [a] in "",(""^bs^""),"")::html_render_deep ctx r + | TEX_FQN (a,b)::r -> (html_liberal (); + (let bs = html_render_flat ctx [a] in let cs = html_render_flat ctx [b] in + ("",(""^bs^""^cs^""),""))::html_render_deep ctx r) | TEX_FUN1hl (_,(f1,f2),a)::r -> ("",f1,"")::(html_render_deep ctx [a]) @ ("",f2,"")::html_render_deep ctx r | TEX_FUN1hf (_,ff,a)::r -> (html_render_deep (new_ctx ff) [a]) @ html_render_deep ctx r | TEX_DECLh (_,ff,a)::r -> (html_render_deep (new_ctx ff) a) @ html_render_deep ctx r @@ -90,6 +102,7 @@ | TEX_LITERAL (TEX_ONLY _)::_ -> raise Too_difficult_for_html | TEX_FUN1 _::_ -> raise Too_difficult_for_html | TEX_FUN2 _::_ -> raise Too_difficult_for_html + | TEX_FUN2nb _::_ -> raise Too_difficult_for_html | TEX_FUN2sq _::_ -> raise Too_difficult_for_html | TEX_INFIX _::_ -> raise Too_difficult_for_html | TEX_MATRIX _::_ -> raise Too_difficult_for_html @@ -106,13 +119,23 @@ | sf,false,false,[] -> mapjoin (function (u,m,d) -> m) (List.rev sf) | sf,true,false,[] -> let ustr,mstr = List.fold_left (fun (us,ms) (u,m,d) -> (us^""^u^"",ms^""^u^"")) ("","") (List.rev sf) in - "" ^ ustr ^ "" ^ mstr ^ "
" + "\n\n" ^ + "\t\t" ^ ustr ^ "\n" ^ + "\t\t" ^ mstr ^ "\n" ^ + "
\n" | sf,false,true,[] -> let mstr,dstr = List.fold_left (fun (ms,ds) (u,m,d) -> (ms^""^m^"",ds^""^d^"")) ("","") (List.rev sf) in - "" ^ mstr ^ "" ^ dstr ^ "
" + "\n\n" ^ + "\t\t" ^ mstr ^ "\n" ^ + "\t\t" ^ dstr ^ "\n" ^ + "
\n" | sf,true,true,[] -> let ustr,mstr,dstr = List.fold_left (fun (us,ms,ds) (u,m,d) -> (us^""^u^"",ms^""^m^"",ds^""^d^"")) ("","","") (List.rev sf) in - "" ^ ustr ^ "" ^ mstr ^ "" ^ dstr ^ "
" + "\n\n" ^ + "\t\t" ^ ustr ^ "\n" ^ + "\t\t" ^ mstr ^ "\n" ^ + "\t\t" ^ dstr ^ "\n" ^ + "
\n" let html_render tree = html_render_table ([],false,false,html_render_deep CTX_NORMAL tree)