From 7d0082aa0b631592f38fc9436a3d0dd5426653cf Mon Sep 17 00:00:00 2001
From: John MacFarlane <jgm@berkeley.edu>
Date: Sat, 25 Feb 2017 12:40:53 +0100
Subject: [PATCH] LaTeX reader: allow hspace and vspace to count as raw block
 or inline.

Previously we would refuse to parse anything as raw inline if
it was in the blockCommands list.  Now we allow exceptions
if they're listed under ignoreInlines in inlineCommands.

This should make it easier e.g. to include an \hspace
between two side-by-side raw LaTeX tables.
---
 src/Text/Pandoc/Readers/LaTeX.hs |  8 +++--
 test/command/hspace.md           | 56 ++++++++++++++++++++++++++++++++
 2 files changed, 61 insertions(+), 3 deletions(-)
 create mode 100644 test/command/hspace.md

diff --git a/src/Text/Pandoc/Readers/LaTeX.hs b/src/Text/Pandoc/Readers/LaTeX.hs
index a13a0c54e..18c240e27 100644
--- a/src/Text/Pandoc/Readers/LaTeX.hs
+++ b/src/Text/Pandoc/Readers/LaTeX.hs
@@ -445,7 +445,6 @@ inlineCommand :: PandocMonad m => LP m Inlines
 inlineCommand = try $ do
   (name, raw') <- withRaw anyControlSeq
   guard $ name /= "begin" && name /= "end"
-  guard $ not $ isBlockCommand name
   exts <- getOption readerExtensions
   star <- option "" (string "*")
   let name' = name ++ star
@@ -461,7 +460,7 @@ inlineCommand = try $ do
                    else ignore rawcommand
   (lookupListDefault mzero [name',name] inlineCommands <*
       optional (try (string "{}")))
-    <|> raw
+    <|> (guard (not (isBlockCommand name)) >> raw)
 
 unlessParseRaw :: PandocMonad m => LP m ()
 unlessParseRaw = getOption readerExtensions >>=
@@ -648,7 +647,10 @@ inlineCommands = M.fromList $
   ] ++ map ignoreInlines
   -- these commands will be ignored unless --parse-raw is specified,
   -- in which case they will appear as raw latex blocks:
-  [ "index" ]
+  [ "index"
+  , "hspace"
+  , "vspace"
+  ]
 
 mkImage :: PandocMonad m => [(String, String)] -> String -> LP m Inlines
 mkImage options src = do
diff --git a/test/command/hspace.md b/test/command/hspace.md
new file mode 100644
index 000000000..5d5c7171b
--- /dev/null
+++ b/test/command/hspace.md
@@ -0,0 +1,56 @@
+`\hspace` and `\vspace` should count as both block and inline.
+
+Here they need to be inline:
+```
+% pandoc -f markdown+raw_tex -t native
+\begin{figure}
+\includegraphics{lalune.jpg}
+\caption{lalune \hspace{2em} \vspace{1em} bloo}
+\end{figure}
+^D
+[RawBlock (Format "latex") "\\begin{figure}\n\\includegraphics{lalune.jpg}\n\\caption{lalune \\hspace{2em} \\vspace{1em} bloo}\n\\end{figure}"]
+```
+
+Here block:
+```
+% pandoc -f markdown+raw_tex -t native
+\begin{tabular}[t]{cc|c}
+\(P\) & \(Q\) & \(P\wedge Q\)\\
+\hline
+T & T &\\
+T & F &\\
+F & T &\\
+F & F &\\
+\end{tabular}
+\hspace{1em}
+\begin{tabular}[t]{cc|c}
+\(P\) & \(Q\) & \(P\vee Q\)\\
+\hline
+T & T &\\
+T & F &\\
+F & T &\\
+F & F &\\
+\end{tabular}
+^D
+[RawBlock (Format "latex") "\\begin{tabular}[t]{cc|c}\n\\(P\\) & \\(Q\\) & \\(P\\wedge Q\\)\\\\\n\\hline\nT & T &\\\\\nT & F &\\\\\nF & T &\\\\\nF & F &\\\\\n\\end{tabular}\\hspace{1em}\\begin{tabular}[t]{cc|c}\n\\(P\\) & \\(Q\\) & \\(P\\vee Q\\)\\\\\n\\hline\nT & T &\\\\\nT & F &\\\\\nF & T &\\\\\nF & F &\\\\\n\\end{tabular}"]
+```
+
+```
+% pandoc -f markdown+raw_tex -t native
+hi\hspace{1em}there
+^D
+[Para [Str "hi",RawInline (Format "tex") "\\hspace{1em}",Str "there"]]
+```
+
+```
+% pandoc -f markdown+raw_tex -t native
+hi
+
+\hspace{1em}
+
+there
+^D
+[Para [Str "hi"]
+,RawBlock (Format "latex") "\\hspace{1em}"
+,Para [Str "there"]]
+```