git.iko.soy/typeable/pandoc
on master help sign in
LaTeX writer: better positioning for hypertarget in figures.

Closes #2813.

commitf47b369f37484c153a1d12ca8049c384fb16929b authorJohn MacFarlane <jgm@berkeley.edu> dateThu 24 Mar 2016, 16:44 (11 years ago) parentbb6897a
1 file changed+23−16
src/Text/Pandoc/Writers/LaTeX.hs+23−16
src/Text/Pandoc/Writers/LaTeX.hs+23−16
@@ -409,16 +409,20 @@ blockToLaTeX (Para [Image attr@(ident, _, _) txt (src,'f':'i':'g':':':tit)]) = d
409409 capt <- inlineListToLaTeX txt
410410 notes <- gets stNotes
411411 modify $ \st -> st{ stInMinipage = False, stNotes = [] }
412+ ref <- text `fmap` toLabel ident
413+ internalLinks <- gets stInternalLinks
414+
412415 -- We can't have footnotes in the list of figures, so remove them:
413416 captForLof <- if null notes
414417 then return empty
415418 else brackets <$> inlineListToLaTeX (walk deNote txt)
416419 img <- inlineToLaTeX (Image attr txt (src,tit))
417420 let footnotes = notesToLaTeX notes
418− caption <- refLabel ident ("\\caption" <> captForLof <> braces capt)
419− let figure = cr <>
421+ lab <- labelFor ident
422+ let caption = "\\caption" <> captForLof <> braces capt <> lab
423+ figure <- hypertarget ident (cr <>
420424 "\\begin{figure}[htbp]" $$ "\\centering" $$ img $$
421− caption $$ "\\end{figure}" <> cr
425+ caption $$ "\\end{figure}" <> cr)
422426 return $ if inNote
423427 -- can't have figures in notes
424428 then "\\begin{center}" $$ img $+$ capt $$ "\\end{center}"
@@ -755,7 +759,8 @@ sectionHeader unnumbered ident level lst = do
755759 -- needed for \paragraph, \subparagraph in quote environment
756760 -- see http://tex.stackexchange.com/questions/169830/
757761 else empty
758− stuffing' <- refLabel ident $ text ('\\':sectionType) <> stuffing
762+ lab <- labelFor ident
763+ stuffing' <- hypertarget ident $ text ('\\':sectionType) <> stuffing <> lab
759764 return $ if level' > 5
760765 then txt
761766 else prefix $$ stuffing'
@@ -765,20 +770,22 @@ sectionHeader unnumbered ident level lst = do
765770 braces txtNoNotes
766771 else empty
767772
768−-- | Append label to x and wrap in hypertarget
769−refLabel :: String -> Doc -> State WriterState Doc
770−refLabel ident x = do
773+hypertarget :: String -> Doc -> State WriterState Doc
774+hypertarget ident x = do
771775 ref <- text `fmap` toLabel ident
772776 internalLinks <- gets stInternalLinks
773− let hypertarget y = if ident `elem` internalLinks
774− then text "\\hypertarget"
775− <> braces ref
776− <> braces y
777− else y
778− label = if null ident
779− then empty
780− else text "\\label" <> braces ref
781− return $ hypertarget $ x <> label
777+ return $
778+ if ident `elem` internalLinks
779+ then text "\\hypertarget"
780+ <> braces ref
781+ <> braces x
782+ else x
783+
784+labelFor :: String -> State WriterState Doc
785+labelFor "" = return empty
786+labelFor ident = do
787+ ref <- text `fmap` toLabel ident
788+ return $ text "\\label" <> braces ref
782789
783790-- | Convert list of inline elements to LaTeX.
784791inlineListToLaTeX :: [Inline] -- ^ Inlines to convert