| Module | MathML::LaTeX::BuiltinEnvironments |
| In: |
lib/math_ml/latex.rb
|
# File lib/math_ml/latex.rb, line 944
944: def initialize
945: add_environment("array", "matrix")
946:
947: super
948: end
# 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
# 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
# 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
# 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