def env_matrix
t = Table.new
hlines = Array.new
hlined = false
row_parsed = false
until @scanner.peek_command=="end"
raise ParseError.new('Matching \end not exist.') if @scanner.eos?
if @scanner.peek_command=="hline"
@scanner.scan_command
t << Tr.new unless row_parsed
hlines << Line::SOLID
row_parsed = false
hlined = true
else
hlines << Line::NONE if row_parsed
t << (r = Tr.new)
r << (td=Td.new)
until @scanner.check(RE::WBSLASH) || @scanner.peek_command=="end" || @scanner.eos?
push_container(td) do |e|
e << parse_to_element(true) until @scanner.peek_command=="end" || @scanner.check(/(&|\\\\)/) || @scanner.eos?
end
r << (td=Td.new) if @scanner.scan(/&/)
end
@scanner.scan(RE::WBSLASH)
row_parsed = true
hlined = false
end
end
t.hlines = hlines
t << Tr.new if hlined
raise ParseError.new("Need \\end{array}.") unless @scanner.peek_command=="end"
@scanner.scan_command
raise ParseError.new("Environment mismatched.") unless @scanner.check_block && @scanner[1]=="matrix"
@scanner.scan_block
t
end