@@ -116,7 +116,7 @@ pandocToMs opts (Pandoc meta blocks) = do
116116-- | Association list of characters to escape.
117117msEscapes :: Map.Map Char String
118118msEscapes = Map.fromList $
119− [ ('\160', "\\ ")
119+ [ ('\160', "\\~")
120120 , ('\'', "\\[aq]")
121121 , ('`', "\\`")
122122 , ('\8217', "'")
@@ -245,22 +245,34 @@ blockToMs _ HorizontalRule = do
245245blockToMs opts (Header level (ident,classes,_) inlines) = do
246246 setFirstPara
247247 contents <- inlineListToMs' opts $ map breakToSpace inlines
248+ let (heading, secnum) = if writerNumberSections opts &&
249+ "unnumbered" `notElem` classes
250+ then (".NH", "\\*[SN]")
251+ else (".SH", "")
248252 let anchor = if null ident
249253 then empty
250254 else nowrap $
251255 text ".pdfhref M " <> doubleQuotes (text ident)
252256 let bookmark = text ".pdfhref O " <> text (show level ++ " ") <>
253− doubleQuotes (text (escapeString (stringify inlines)))
257+ doubleQuotes (text $ secnum ++
258+ (if null secnum
259+ then ""
260+ else " ") ++
261+ escapeString (stringify inlines))
262+ let backlink = nowrap (text ".pdfhref L -D " <>
263+ doubleQuotes (text ident) <> space <> text "\\") <> cr <>
264+ text " -- "
254265 let tocEntry = if writerTableOfContents opts &&
255266 level <= writerTOCDepth opts
256− then text ".XS" $$
257− (text (replicate level '\t') <> contents) $$
258− text ".XE"
267+ then text ".XS"
268+ $$ backlink <> doubleQuotes (
269+ nowrap ((text (replicate level '\t') <>
270+ (if null secnum
271+ then empty
272+ else text secnum <> text "\\~\\~")
273+ <> contents)))
274+ $$ text ".XE"
259275 else empty
260− let heading = if writerNumberSections opts &&
261− "unnumbered" `notElem` classes
262− then ".NH"
263− else ".SH"
264276 modify $ \st -> st{ stFirstPara = True }
265277 return $ (text heading <> space <> text (show level)) $$
266278 contents $$