diff --git a/changelog b/changelog
--- a/changelog
+++ b/changelog
@@ -1,3 +1,7 @@
+texmath (0.9.2)
+
+  * Support `\newenvironment` and `\renewenvironment`.
+
 texmath (0.9.1.1)
 
   * Added program to generate cbits/{key,val}ToASCII.c from a data file.
diff --git a/src/Text/TeXMath/Readers/TeX.hs b/src/Text/TeXMath/Readers/TeX.hs
--- a/src/Text/TeXMath/Readers/TeX.hs
+++ b/src/Text/TeXMath/Readers/TeX.hs
@@ -316,13 +316,18 @@
 endLine = try $ do
   symbol "\\\\"
   optional inbrackets  -- can contain e.g. [1.0in] for a line height, not yet supported
-  optional $ ctrlseq "hline"
-  -- we don't represent the line, but it shouldn't crash parsing
   return '\n'
 
 arrayLine :: TP ArrayLine
 arrayLine = notFollowedBy (ctrlseq "end" >> return '\n') >>
-  sepBy1 (unGrouped <$> manyExp (notFollowedBy endLine >> expr)) (symbol "&")
+  sepBy1 (unGrouped <$>
+    manyExp (try $ ignorable' *>
+               notFollowedBy endLine *>
+               expr <*
+               ignorable')) (symbol "&")
+  where ignorable' = ignorable >>
+                     optional (try (ctrlseq "hline" >> ignorable'))
+  -- we don't represent the line, but it shouldn't crash parsing
 
 arrayAlignments :: TP [Alignment]
 arrayAlignments = try $ do
diff --git a/src/Text/TeXMath/Readers/TeX/Macros.hs b/src/Text/TeXMath/Readers/TeX/Macros.hs
--- a/src/Text/TeXMath/Readers/TeX/Macros.hs
+++ b/src/Text/TeXMath/Readers/TeX/Macros.hs
@@ -31,6 +31,7 @@
 import Data.Char (isDigit, isLetter)
 import Control.Monad
 import Text.ParserCombinators.Parsec
+import Control.Applicative ((<*))
 
 data Macro = Macro { macroDefinition :: String
                    , macroParser     :: forall st . GenParser Char st String }
@@ -60,7 +61,7 @@
 -- | Parses a @\\newcommand@ or @\\renewcommand@ macro definition and
 -- returns a 'Macro'.
 pMacroDefinition :: GenParser Char st Macro
-pMacroDefinition = newcommand <|> declareMathOperator
+pMacroDefinition = newcommand <|> declareMathOperator <|> newenvironment
 
 -- | Skip whitespace and comments.
 pSkipSpaceComments :: GenParser Char st ()
@@ -116,7 +117,6 @@
   name <- inbraces <|> ctrlseq
   guard (take 1 name == "\\")
   let name' = drop 1 name
-  pSkipSpaceComments
   numargs <- numArgs
   pSkipSpaceComments
   optarg <- if numargs > 0
@@ -147,6 +147,55 @@
                      Nothing -> args
     return $ apply args' $ "{" ++ body ++ "}"
 
+newenvironment :: GenParser Char st Macro
+newenvironment = try $ do
+  char '\\'
+  -- we ignore differences between these so far:
+  optional (string "re")
+  string "newenvironment"
+  optional (char '*')
+  pSkipSpaceComments
+  name <- inbraces <|> ctrlseq
+  numargs <- numArgs
+  pSkipSpaceComments
+  optarg <- if numargs > 0
+               then optArg <* pSkipSpaceComments
+               else return Nothing
+  let numargs' = case optarg of
+                   Just _  -> numargs - 1
+                   Nothing -> numargs
+  opener <- inbraces <|> ctrlseq
+  pSkipSpaceComments
+  closer <- inbraces <|> ctrlseq
+  let defn = "\\newenvironment{" ++ name ++ "}" ++
+             (if numargs > 0 then ("[" ++ show numargs ++ "]") else "") ++
+             case optarg of { Nothing -> ""; Just x -> "[" ++ x ++ "]"} ++
+             "%\n{" ++ opener ++ "}%\n" ++ "{" ++ closer ++ "}"
+  return $ Macro defn $ try $ do
+    string "\\begin"
+    pSkipSpaceComments
+    char '{'
+    string name
+    pSkipSpaceComments
+    char '}'
+    opt <- case optarg of
+                Nothing  -> return Nothing
+                Just _   -> liftM (`mplus` optarg) optArg
+    args <- count numargs' (pSkipSpaceComments >>
+                  (inbraces <|> ctrlseq <|> count 1 anyChar))
+    let args' = case opt of
+                     Just x  -> x : args
+                     Nothing -> args
+    let ender = try $ do
+                      string "\\end"
+                      pSkipSpaceComments
+                      char '{'
+                      string name
+                      char '}'
+    body <- manyTill anyChar ender
+    return $ apply args'
+           $ opener ++ body ++ closer
+
 -- | Parser for \DeclareMathOperator(*) command.
 declareMathOperator :: GenParser Char st Macro
 declareMathOperator = try $ do
@@ -191,7 +240,7 @@
   return ()
 
 numArgs :: GenParser Char st Int
-numArgs = option 0 $ do
+numArgs = option 0 $ try $ do
   pSkipSpaceComments
   char '['
   pSkipSpaceComments
@@ -217,8 +266,9 @@
 inbraces :: GenParser Char st String
 inbraces = try $ do
   char '{'
-  res <- manyTill (skipComment >> (inbraces' <|> count 1 anyChar <|> escaped "{}"))
-    (try $ skipComment >> char '}')
+  res <- manyTill (pSkipSpaceComments >>
+            (inbraces' <|> count 1 anyChar <|> escaped "{}"))
+    (try $ pSkipSpaceComments >> char '}')
   return $ concat res
 
 inbraces' :: GenParser Char st String
diff --git a/tests/readers/tex/macros.native b/tests/readers/tex/macros.native
--- a/tests/readers/tex/macros.native
+++ b/tests/readers/tex/macros.native
@@ -1,1 +1,1 @@
-[ENumber "2",ENumber "5",EGrouped [EIdentifier "y",ESymbol Bin "+",ENumber "3"],EGrouped [EIdentifier "x",ESymbol Bin "+",ENumber "3"],EGrouped [EIdentifier "x",ESymbol Bin "+",EIdentifier "\945"]]
+[ENumber "2",ENumber "5",EGrouped [EIdentifier "y",ESymbol Bin "+",ENumber "3"],EGrouped [EIdentifier "x",ESymbol Bin "+",ENumber "3"],EGrouped [EIdentifier "x",ESymbol Bin "+",EIdentifier "\945"],EArray [AlignCenter,AlignCenter] [[[ENumber "2"],[ENumber "3"]],[[ENumber "4"],[ENumber "5"]]]]
diff --git a/tests/src/macros.tex b/tests/src/macros.tex
--- a/tests/src/macros.tex
+++ b/tests/src/macros.tex
@@ -12,8 +12,19 @@
 \renewcommand{\phi}{\aaa}
 \newcommand{\b}[1]{#1}
 
+\newenvironment{ary}
+{\begin{array}{cc}
+\hline}
+{\hline
+\end{array}}
+
 \phi
 \abc
 \xyz[y] {3}
 \xyz 3
 \xyz \alpha
+
+\begin{ary}
+2 & 3\\
+4 & 5
+\end{ary}
diff --git a/tests/writers/macros.mml b/tests/writers/macros.mml
--- a/tests/writers/macros.mml
+++ b/tests/writers/macros.mml
@@ -18,5 +18,23 @@
       <mo>+</mo>
       <mi>α</mi>
     </mrow>
+    <mtable>
+      <mtr>
+        <mtd columnalign="center">
+          <mn>2</mn>
+        </mtd>
+        <mtd columnalign="center">
+          <mn>3</mn>
+        </mtd>
+      </mtr>
+      <mtr>
+        <mtd columnalign="center">
+          <mn>4</mn>
+        </mtd>
+        <mtd columnalign="center">
+          <mn>5</mn>
+        </mtd>
+      </mtr>
+    </mtable>
   </mrow>
 </math>
diff --git a/tests/writers/macros.omml b/tests/writers/macros.omml
--- a/tests/writers/macros.omml
+++ b/tests/writers/macros.omml
@@ -37,5 +37,49 @@
     <m:r>
       <m:t>α</m:t>
     </m:r>
+    <m:m>
+      <m:mPr>
+        <m:baseJc m:val="center" />
+        <m:plcHide m:val="1" />
+        <m:mcs>
+          <m:mc>
+            <m:mcPr>
+              <m:mcJc m:val="center" />
+              <m:count m:val="1" />
+            </m:mcPr>
+          </m:mc>
+          <m:mc>
+            <m:mcPr>
+              <m:mcJc m:val="center" />
+              <m:count m:val="1" />
+            </m:mcPr>
+          </m:mc>
+        </m:mcs>
+      </m:mPr>
+      <m:mr>
+        <m:e>
+          <m:r>
+            <m:t>2</m:t>
+          </m:r>
+        </m:e>
+        <m:e>
+          <m:r>
+            <m:t>3</m:t>
+          </m:r>
+        </m:e>
+      </m:mr>
+      <m:mr>
+        <m:e>
+          <m:r>
+            <m:t>4</m:t>
+          </m:r>
+        </m:e>
+        <m:e>
+          <m:r>
+            <m:t>5</m:t>
+          </m:r>
+        </m:e>
+      </m:mr>
+    </m:m>
   </m:oMath>
 </m:oMathPara>
diff --git a/tests/writers/macros.tex b/tests/writers/macros.tex
--- a/tests/writers/macros.tex
+++ b/tests/writers/macros.tex
@@ -1,1 +1,4 @@
-25{y + 3}{x + 3}{x + \alpha}
+25{y + 3}{x + 3}{x + \alpha}\begin{matrix}
+2 & 3 \\
+4 & 5 \\
+\end{matrix}
diff --git a/texmath.cabal b/texmath.cabal
--- a/texmath.cabal
+++ b/texmath.cabal
@@ -1,5 +1,5 @@
 Name:                texmath
-Version:             0.9.1.1
+Version:             0.9.2
 Cabal-Version:       >= 1.10
 Build-type:          Simple
 Synopsis:            Conversion between formats used to represent mathematics.
