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