git.iko.soy/typeable/pandoc
on master help sign in
LaTeX writer: better positioning for hypertarget in figures.
f47b369John MacFarlane
src/Text/Pandoc/Writers/LaTeX.hs+23−16
@@ -409,16 +409,20 @@ blockToLaTeX (Para [Image attr@(ident, _, _) txt (src,'f':'i':'g':':':tit)]) = d
409 capt <- inlineListToLaTeX txt
409 capt <- inlineListToLaTeX txt
410 notes <- gets stNotes
410 notes <- gets stNotes
411 modify $ \st -> st{ stInMinipage = False, stNotes = [] }
411 modify $ \st -> st{ stInMinipage = False, stNotes = [] }
412+ ref <- text `fmap` toLabel ident
413+ internalLinks <- gets stInternalLinks
414+
412 -- We can't have footnotes in the list of figures, so remove them:
415 -- We can't have footnotes in the list of figures, so remove them:
413 captForLof <- if null notes
416 captForLof <- if null notes
414 then return empty
417 then return empty
415 else brackets <$> inlineListToLaTeX (walk deNote txt)
418 else brackets <$> inlineListToLaTeX (walk deNote txt)
416 img <- inlineToLaTeX (Image attr txt (src,tit))
419 img <- inlineToLaTeX (Image attr txt (src,tit))
417 let footnotes = notesToLaTeX notes
420 let footnotes = notesToLaTeX notes
421+ lab <- labelFor ident
418− caption <- refLabel ident ("\\caption" <> captForLof <> braces capt)
422+ let caption = "\\caption" <> captForLof <> braces capt <> lab
419− let figure = cr <>
423+ figure <- hypertarget ident (cr <>
420 "\\begin{figure}[htbp]" $$ "\\centering" $$ img $$
424 "\\begin{figure}[htbp]" $$ "\\centering" $$ img $$
421− caption $$ "\\end{figure}" <> cr
425+ caption $$ "\\end{figure}" <> cr)
422 return $ if inNote
426 return $ if inNote
423 -- can't have figures in notes
427 -- can't have figures in notes
424 then "\\begin{center}" $$ img $+$ capt $$ "\\end{center}"
428 then "\\begin{center}" $$ img $+$ capt $$ "\\end{center}"
@@ -755,7 +759,8 @@ sectionHeader unnumbered ident level lst = do
755 -- needed for \paragraph, \subparagraph in quote environment
759 -- needed for \paragraph, \subparagraph in quote environment
756 -- see http://tex.stackexchange.com/questions/169830/
760 -- see http://tex.stackexchange.com/questions/169830/
757 else empty
761 else empty
762+ lab <- labelFor ident
758− stuffing' <- refLabel ident $ text ('\\':sectionType) <> stuffing
763+ stuffing' <- hypertarget ident $ text ('\\':sectionType) <> stuffing <> lab
759 return $ if level' > 5
764 return $ if level' > 5
760 then txt
765 then txt
761 else prefix $$ stuffing'
766 else prefix $$ stuffing'
@@ -765,20 +770,22 @@ sectionHeader unnumbered ident level lst = do
765 braces txtNoNotes
770 braces txtNoNotes
766 else empty
771 else empty
767
772
768−-- | Append label to x and wrap in hypertarget
769−refLabel :: String -> Doc -> State WriterState Doc
773+hypertarget :: String -> Doc -> State WriterState Doc
770−refLabel ident x = do
774+hypertarget ident x = do
771 ref <- text `fmap` toLabel ident
775 ref <- text `fmap` toLabel ident
772 internalLinks <- gets stInternalLinks
776 internalLinks <- gets stInternalLinks
777+ return $
773− let hypertarget y = if ident `elem` internalLinks
778+ if ident `elem` internalLinks
774− then text "\\hypertarget"
779+ then text "\\hypertarget"
775− <> braces ref
780+ <> braces ref
776− <> braces y
781+ <> braces x
777− else y
782+ else x
778− label = if null ident
783+
779− then empty
784+labelFor :: String -> State WriterState Doc
780− else text "\\label" <> braces ref
785+labelFor "" = return empty
781− return $ hypertarget $ x <> label
786+labelFor ident = do
787+ ref <- text `fmap` toLabel ident
788+ return $ text "\\label" <> braces ref
782
789
783-- | Convert list of inline elements to LaTeX.
790-- | Convert list of inline elements to LaTeX.
784inlineListToLaTeX :: [Inline] -- ^ Inlines to convert
791inlineListToLaTeX :: [Inline] -- ^ Inlines to convert