Ms writer: Hyperlink table of contents and other improvements.

This commit is contained in:
John MacFarlane 2017-03-26 20:01:37 +02:00
parent 0ae448e638
commit 0eb62f03fe
3 changed files with 46 additions and 13 deletions

View file

@ -42,6 +42,17 @@
.ds PDFHREF.COLOUR 0.35 0.00 0.60
.\" border for links (default none)
.ds PDFHREF.BORDER 0 0 0
.\" point size difference between heading levels
.nr PSINCR 1p
.\" heading level above which point size no longer changes
.nr GROWPS 2
.\" comment these out if you want a dot after section numbers:
.als SN SN-NO-DOT
.als SN-STYLE SN-NO-DOT
.\" pdf outline fold level
.nr PDFOUTLINE.FOLDLEVEL 3
.\" start out in outline view
.pdfview /PageMode /UseOutlines
.\" ***************************************************************
.\" PDF metadata
.pdfinfo /Title "$title-meta$"
@ -85,7 +96,6 @@ $endfor$
.1C
$body$
$if(toc)$
$toc$
.TC
$endif$
$for(include-after)$

View file

@ -116,7 +116,7 @@ pandocToMs opts (Pandoc meta blocks) = do
-- | Association list of characters to escape.
msEscapes :: Map.Map Char String
msEscapes = Map.fromList $
[ ('\160', "\\ ")
[ ('\160', "\\~")
, ('\'', "\\[aq]")
, ('`', "\\`")
, ('\8217', "'")
@ -245,22 +245,34 @@ blockToMs _ HorizontalRule = do
blockToMs opts (Header level (ident,classes,_) inlines) = do
setFirstPara
contents <- inlineListToMs' opts $ map breakToSpace inlines
let (heading, secnum) = if writerNumberSections opts &&
"unnumbered" `notElem` classes
then (".NH", "\\*[SN]")
else (".SH", "")
let anchor = if null ident
then empty
else nowrap $
text ".pdfhref M " <> doubleQuotes (text ident)
let bookmark = text ".pdfhref O " <> text (show level ++ " ") <>
doubleQuotes (text (escapeString (stringify inlines)))
doubleQuotes (text $ secnum ++
(if null secnum
then ""
else " ") ++
escapeString (stringify inlines))
let backlink = nowrap (text ".pdfhref L -D " <>
doubleQuotes (text ident) <> space <> text "\\") <> cr <>
text " -- "
let tocEntry = if writerTableOfContents opts &&
level <= writerTOCDepth opts
then text ".XS" $$
(text (replicate level '\t') <> contents) $$
text ".XE"
then text ".XS"
$$ backlink <> doubleQuotes (
nowrap ((text (replicate level '\t') <>
(if null secnum
then empty
else text secnum <> text "\\~\\~")
<> contents)))
$$ text ".XE"
else empty
let heading = if writerNumberSections opts &&
"unnumbered" `notElem` classes
then ".NH"
else ".SH"
modify $ \st -> st{ stFirstPara = True }
return $ (text heading <> space <> text (show level)) $$
contents $$

View file

@ -42,6 +42,17 @@
.ds PDFHREF.COLOUR 0.35 0.00 0.60
.\" border for links (default none)
.ds PDFHREF.BORDER 0 0 0
.\" point size difference between heading levels
.nr PSINCR 1p
.\" heading level above which point size no longer changes
.nr GROWPS 2
.\" comment these out if you want a dot after section numbers:
.als SN SN-NO-DOT
.als SN-STYLE SN-NO-DOT
.\" pdf outline fold level
.nr PDFOUTLINE.FOLDLEVEL 3
.\" start out in outline view
.pdfview /PageMode /UseOutlines
.\" ***************************************************************
.\" PDF metadata
.pdfinfo /Title "Pandoc Test Suite"
@ -427,7 +438,7 @@ Nested.
.LP
Should not be a list item:
.PP
M.A.\ 2007
M.A.\~2007
.PP
B.
Williams
@ -643,9 +654,9 @@ This is code: \f[C]>\f[], \f[C]$\f[], \f[C]\\\f[], \f[C]\\$\f[],
.PP
\m[strikecolor]This is \f[I]strikeout\f[].\m[]
.PP
Superscripts: a\*{bc\*}d a\*{\f[I]hello\f[]\*} a\*{hello\ there\*}.
Superscripts: a\*{bc\*}d a\*{\f[I]hello\f[]\*} a\*{hello\~there\*}.
.PP
Subscripts: H\*<2\*>O, H\*<23\*>O, H\*<many\ of\ them\*>O.
Subscripts: H\*<2\*>O, H\*<23\*>O, H\*<many\~of\~them\*>O.
.PP
These should not be superscripts or subscripts,
because of the unescaped spaces: a\[ha]b c\[ha]d, a\[ti]b c\[ti]d.