module MathML::LaTeX::BuiltinGroups

Public Class Methods

new() click to toggle source
Calls superclass method
    # File lib/math_ml/latex.rb
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

Public Instance Methods

add_environment(*a) click to toggle source
    # File lib/math_ml/latex.rb
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
grp_begin() click to toggle source
    # File lib/math_ml/latex.rb
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
grp_left_etc() click to toggle source
    # File lib/math_ml/latex.rb
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