| 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