Module | MathML::LaTeX::BuiltinGroups |
In: |
lib/math_ml/latex.rb
|
# File lib/math_ml/latex.rb, line 830 830: def initialize 831: add_group("begin", "end") 832: add_group("left", "right", :left_etc) 833: add_group("bigg", "bigg", :left_etc) 834: @environments = Hash.new 835: 836: super 837: end
# File lib/math_ml/latex.rb, line 839 839: def add_environment(*a) 840: @environments = Hash.new unless @environments 841: if a.size==1 && Hash===a[0] 842: @environments.merge!(hash) 843: else 844: a.each{|i| @environments[i] = false} 845: end 846: end
# File lib/math_ml/latex.rb, line 848 848: def grp_begin 849: matched = @scanner.matched 850: begin_pos = @scanner.pos-matched.size 851: en = @scanner.scan_block ? @scanner[1] : @scanner.scan_any 852: raise ParseError.new('Environment name not exist.') unless en 853: 854: macro = @macro.environments(en) 855: if macro 856: begin 857: flg = @expanded_environment.include?(en) 858: @expanded_environment.push(en) 859: raise CircularReferenceEnvironment if flg 860: 861: pos = @scanner.pos 862: option = (macro.option && @scanner.scan_option) ? @scanner[1] : nil 863: params = Array.new 864: (1..macro.num).each do 865: params << (@scanner.scan_block ? @scanner[1] : @scanner.scan_any) 866: raise ParseError.new("Need more parameter.") unless params.last 867: end 868: body = "" 869: grpnest = 0 870: until @scanner.peek_command=="end" && grpnest==0 871: if @scanner.eos? 872: @scanner.pos = pos 873: raise ParseError.new('Matching \end not exist.') 874: end 875: com = @scanner.peek_command 876: grpnest += 1 if @group_begins.has_key?(com) 877: grpnest -=1 if @group_ends.has_key?(com) && @group_begins[com] 878: raise ParseError.new("Syntax error.") if grpnest<0 879: 880: body << @scanner.scan_any(true) 881: end 882: @scanner.scan_command 883: raise ParseError.new("Environment mismatched.", @scanner.matched) unless en==(@scanner.scan_block ? @scanner[1] : @scanner.scan_any) 884: begin 885: return parse_into(@macro.expand_environment(en, body, params, option), Array.new) 886: rescue CircularReferenceEnvironment 887: if @expanded_environment.size>1 888: raise 889: else 890: @scanner.pos = begin_pos 891: raise ParseError.new("Circular reference.") 892: end 893: rescue ParseError => e 894: if @expanded_environment.size>1 895: raise 896: else 897: @scanner.pos = begin_pos 898: raise ParseError.new(%[Error in macro(#{e.message} "#{e.rest.strip}").]) 899: end 900: end 901: ensure 902: @expanded_environment.pop 903: end 904: end 905: 906: raise ParseError.new("Undefined environment.") unless @environments.has_key?(en) 907: e = @environments[en] 908: e = en unless e # default method name 909: __send__("env_#{e.to_s}") 910: end
# File lib/math_ml/latex.rb, line 912 912: def grp_left_etc 913: right = 914: case @scanner[1] 915: when "left" 916: "right" 917: when "bigg" 918: "bigg" 919: end 920: 921: f = Fenced.new 922: p = @scanner.pos 923: o = @scanner.scan_any 924: raise ParseError.new('Need brace here.') unless o && (o=~RE::BRACES || @delimiters.include?(o[RE::COMMANDS, 1])) 925: f.open = (o=~RE::BRACES ? o : parse_symbol_command(o[RE::COMMANDS, 1], true)) 926: f << push_container(Row.new) do |r| 927: until @scanner.peek_command==right 928: if @scanner.eos? 929: @scanner.pos = p 930: raise ParseError.new('Brace not closed.') 931: end 932: r << parse_to_element(true) 933: end 934: end 935: @scanner.scan_command # skip right 936: c = @scanner.scan_any 937: raise ParseError.new('Need brace here.') unless c=~RE::BRACES || @delimiters.include?(c[RE::COMMANDS, 1]) 938: f.close = (c=~RE::BRACES ? c : parse_symbol_command(c[RE::COMMANDS, 1], true)) 939: f 940: end