Module MathML::LaTeX::BuiltinGroups
In: lib/math_ml/latex.rb

Methods

Classes and Modules

Class MathML::LaTeX::BuiltinGroups::CircularReferenceEnvironment

Public Class methods

[Source]

     # 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

Public Instance methods

[Source]

     # 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

[Source]

     # 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

[Source]

     # 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

[Validate]