@@ -215,20 +215,24 @@ escapeNormal :: PandocMonad m => RoffLexer m [LinePart]
215215escapeNormal = do
216216 c <- anyChar
217217 case c of
218+ 'A' -> quoteArg >>= checkDefined
218219 'C' -> quoteArg >>= resolveGlyph '\''
219220 'f' -> escFont
220221 's' -> escFontSize
221222 '*' -> escString
222223 '"' -> mempty <$ skipMany (satisfy (/='\n')) -- line comment
223224 '#' -> mempty <$ manyTill anyChar newline
224− '%' -> return mempty
225+ '%' -> return mempty -- optional hyphenation
226+ ':' -> return mempty -- zero-width break
225227 '{' -> return mempty
226228 '}' -> return mempty
227− '&' -> return mempty
228− '\n' -> return mempty
229− ':' -> return mempty
230− '0' -> return mempty
231− 'c' -> return mempty
229+ '&' -> return mempty -- nonprintable zero-width
230+ ')' -> return mempty -- nonprintable zero-width
231+ '/' -> return mempty -- to fix spacing before roman
232+ ',' -> return mempty -- to fix spacing after roman
233+ '\n' -> return mempty -- line continuation
234+ 'c' -> return mempty -- interrupt text processing
235+ 'a' -> return mempty -- "non-interpreted leader character"
232236 '-' -> return [RoffStr "-"]
233237 '_' -> return [RoffStr "_"]
234238 ' ' -> return [RoffStr " "]
@@ -240,13 +244,31 @@ escapeNormal = do
240244 return [RoffStr "\\"]
241245 't' -> return [RoffStr "\t"]
242246 'e' -> return [RoffStr "\\"]
247+ 'E' -> do
248+ mode <- roffMode <$> getState
249+ case mode of
250+ CopyMode -> return mempty
251+ NormalMode -> return [RoffStr "\\"]
243252 '`' -> return [RoffStr "`"]
244− '^' -> return [RoffStr " "]
245− '|' -> return [RoffStr " "]
253+ '^' -> return [RoffStr "\x200A"] -- 1/12 em space
254+ '|' -> return [RoffStr "\x2006"] --1/6 em space
246255 '\'' -> return [RoffStr "`"]
247256 '.' -> return [RoffStr "`"]
248257 '~' -> return [RoffStr "\160"] -- nonbreaking space
249− _ -> escUnknown ['\\',c]
258+ '0' -> return [RoffStr "\x2007"] -- digit-width space
259+ _ -> escIgnore c
260+
261+escIgnore :: PandocMonad m => Char -> RoffLexer m [LinePart]
262+escIgnore c = do
263+ pos <- getPosition
264+ nextc <- lookAhead anyChar
265+ arg <- case nextc of
266+ '[' -> (\x -> "[" ++ x ++ "]") <$> escapeArg
267+ '(' -> ('(':) <$> escapeArg
268+ '\'' -> (\x -> "'" ++ x ++ "'") <$> quoteArg
269+ _ -> count 1 anyChar
270+ report $ SkippedContent ('\\':c:arg) pos
271+ return mempty
250272
251273escUnknown :: PandocMonad m => String -> RoffLexer m [LinePart]
252274escUnknown s = do
@@ -291,7 +313,7 @@ quoteArg = char '\'' *> manyTill (noneOf ['\n','\'']) (char '\'')
291313escFont :: PandocMonad m => RoffLexer m [LinePart]
292314escFont = do
293315 font <- escapeArg <|> count 1 alphaNum
294− font' <- if null font
316+ font' <- if null font || font == "P"
295317 then prevFont <$> getState
296318 else return $ foldr processFontLetter defaultFontSpec font
297319 modifyState $ \st -> st{ prevFont = currentFont st
@@ -581,6 +603,13 @@ lexArgs = do
581603 char '"'
582604 return [RoffStr "\""]
583605
606+checkDefined :: PandocMonad m => String -> RoffLexer m [LinePart]
607+checkDefined name = do
608+ macros <- customMacros <$> getState
609+ case M.lookup name macros of
610+ Just _ -> return [RoffStr "1"]
611+ Nothing -> return [RoffStr "0"]
612+
584613escString :: PandocMonad m => RoffLexer m [LinePart]
585614escString = try $ do
586615 pos <- getPosition