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

Methods

Public Class methods

[Source]

     # File lib/math_ml/latex.rb, line 944
944:                         def initialize
945:                                 add_environment("array", "matrix")
946: 
947:                                 super
948:                         end

Public Instance methods

[Source]

      # File lib/math_ml/latex.rb, line 950
 950:                         def env_array
 951:                                 layout = @scanner.scan_block ? @scanner.matched : @scanner.scan(/./)
 952:                                 l = Scanner.new(layout=~RE::BLOCK ? layout[RE::BLOCK, 1] : layout)
 953:                                 t = Table.new
 954:                                 aligns = Array.new
 955:                                 vlines = Array.new
 956:                                 vlined = l.check(/\|/)
 957:                                 columned = false
 958:                                 until l.eos?
 959:                                         c = l.scan_any
 960:                                         raise ParseError.new("Syntax error.", layout[/\A.*(#{Regexp.escape(c+l.rest)}.*\z)/m, 1]) unless c=~/[clr\|@]/
 961: 
 962:                                         if c=='|'
 963:                                                 aligns << Align::CENTER if vlined
 964:                                                 vlines << Line::SOLID
 965:                                                 vlined = true
 966:                                                 columned = false
 967:                                         else
 968:                                                 vlines << Line::NONE if columned
 969:                                                 vlined = false
 970:                                                 columned = true
 971:                                                 case c
 972:                                                 when 'l'
 973:                                                         aligns << Align::LEFT
 974:                                                 when 'c'
 975:                                                         aligns << Align::CENTER
 976:                                                 when 'r'
 977:                                                         aligns << Align::RIGHT
 978:                                                 when '@'
 979:                                                         aligns << Align::CENTER
 980:                                                         l.scan_any
 981:                                                 end
 982:                                         end
 983:                                 end
 984:                                 t.aligns = aligns
 985:                                 t.vlines = vlines
 986: 
 987:                                 layout = layout[RE::BLOCK, 1] if layout=~RE::BLOCK
 988:                                 raise ParseError.new('Need parameter here.') if layout==""
 989: 
 990:                                 hlines = Array.new
 991:                                 row_parsed = false
 992:                                 hlined = false
 993:                                 until @scanner.peek_command=="end"
 994:                                         raise ParseError.new('Matching \end not exist.') if @scanner.eos?
 995:                                         if @scanner.peek_command=="hline"
 996:                                                 @scanner.scan_command
 997:                                                 t << Tr.new unless row_parsed
 998:                                                 hlines << Line::SOLID
 999:                                                 row_parsed = false
1000:                                                 hlined = true
1001:                                         else
1002:                                                 hlines << Line::NONE if row_parsed
1003:                                                 t << env_array_row(l.string)
1004:                                                 @scanner.scan(RE::WBSLASH)
1005:                                                 row_parsed = true
1006:                                                 hlined = false
1007:                                         end
1008:                                 end
1009:                                 t.hlines = hlines
1010: 
1011:                                 if hlined
1012:                                         tr = Tr.new
1013:                                         (0..vlines.size).each {|i| tr << Td.new}
1014:                                         t << tr
1015:                                 end
1016: 
1017:                                 @scanner.scan_command
1018:                                 raise ParseError.new("Environment mismatched.") unless @scanner.check_block && @scanner[1]=="array"
1019:                                 @scanner.scan_block
1020:                                 t
1021:                         end

[Source]

      # File lib/math_ml/latex.rb, line 1023
1023:                         def env_array_row(layout)
1024:                                 l = Scanner.new(layout)
1025:                                 r = Tr.new
1026:                                 first_column = true
1027:                                 vlined = l.check(/\|/)
1028:                                 until l.eos?
1029:                                         c = l.scan(/./)
1030:                                         if c=='|'
1031:                                                 r << Td.new if vlined
1032:                                                 vlined = true
1033:                                                 next
1034:                                         else
1035:                                                 vlined = false
1036:                                                 case c
1037:                                                 when 'r', 'l', 'c'
1038:                                                 when '@'
1039:                                                         r << parse_into(l.scan_any, Td.new)
1040:                                                         next
1041:                                                 end
1042:                                                 if first_column
1043:                                                         first_column = false
1044:                                                 else
1045:                                                         raise ParseError.new("Need more column.", @scanner.matched.to_s) unless @scanner.scan(/&/)
1046:                                                 end
1047:                                                 r << push_container(Td.new) do |td|
1048:                                                         td << parse_to_element(true) until @scanner.peek_command=="end" || @scanner.check(/(&|\\\\)/) || @scanner.eos?
1049:                                                 end
1050:                                         end
1051:                                 end
1052:                                 r << Td.new if vlined
1053:                                 raise ParseError.new("Too many column.") if @scanner.check(/&/)
1054:                                 r
1055:                         end

[Source]

      # File lib/math_ml/latex.rb, line 1057
1057:                         def env_matrix
1058:                                 t = Table.new
1059:                                 hlines = Array.new
1060:                                 hlined = false
1061:                                 row_parsed = false
1062:                                 until @scanner.peek_command=="end"
1063:                                         raise ParseError.new('Matching \end not exist.') if @scanner.eos?
1064:                                         if @scanner.peek_command=="hline"
1065:                                                 @scanner.scan_command
1066:                                                 t << Tr.new unless row_parsed
1067:                                                 hlines << Line::SOLID
1068:                                                 row_parsed = false
1069:                                                 hlined = true
1070:                                         else
1071:                                                 hlines << Line::NONE if row_parsed
1072:                                                 t << (r = Tr.new)
1073:                                                 r << (td=Td.new)
1074:                                                 until @scanner.check(RE::WBSLASH) || @scanner.peek_command=="end" || @scanner.eos?
1075:                                                         push_container(td) do |e|
1076:                                                                 e << parse_to_element(true) until @scanner.peek_command=="end" || @scanner.check(/(&|\\\\)/) || @scanner.eos?
1077:                                                         end
1078:                                                         r << (td=Td.new) if @scanner.scan(/&/)
1079:                                                 end
1080:                                                 @scanner.scan(RE::WBSLASH)
1081:                                                 row_parsed = true
1082:                                                 hlined = false
1083:                                         end
1084:                                 end
1085:                                 t.hlines = hlines
1086: 
1087:                                 t << Tr.new if hlined
1088: 
1089:                                 raise ParseError.new("Need \\end{array}.") unless @scanner.peek_command=="end"
1090:                                 @scanner.scan_command
1091:                                 raise ParseError.new("Environment mismatched.") unless @scanner.check_block && @scanner[1]=="matrix"
1092:                                 @scanner.scan_block
1093:                                 t
1094:                         end

[Source]

      # File lib/math_ml/latex.rb, line 1096
1096:                         def env_matrix_row
1097:                                 r = Tr.new
1098:                                 until @scanner.check(RE::WBSLASH) || @scanner.peek_command=="end"
1099:                                         r << push_container(Td.new) do |td|
1100:                                                 td << parse_to_element(true) until @scanner.peek_command=="end" || @scanner.check(/(&|\\\\)/) || @scanner.eos?
1101:                                         end
1102:                                 end
1103:                         end

[Validate]