git.iko.soy/typeable/pandoc
on master help sign in
Merge pull request #2637 from mb21/latex-figure-label

LaTeX writer: figure label

commit3af753de477c79a06dd40839f5fb2c9da299c20a authorJohn MacFarlane <jgm@berkeley.edu> dateSat 19 Mar 2016, 13:56 (11 years ago) parent3aa7bd11fde920
1 file changed+24−19
src/Text/Pandoc/Writers/LaTeX.hs+24−19
src/Text/Pandoc/Writers/LaTeX.hs+24−19
@@ -403,7 +403,7 @@ blockToLaTeX (Div (identifier,classes,kvs) bs) = do
403403blockToLaTeX (Plain lst) =
404404 inlineListToLaTeX $ dropWhile isLineBreakOrSpace lst
405405-- title beginning with fig: indicates that the image is a figure
406−blockToLaTeX (Para [Image attr txt (src,'f':'i':'g':':':tit)]) = do
406+blockToLaTeX (Para [Image attr@(ident, _, _) txt (src,'f':'i':'g':':':tit)]) = do
407407 inNote <- gets stInNote
408408 modify $ \st -> st{ stInMinipage = True, stNotes = [] }
409409 capt <- inlineListToLaTeX txt
@@ -415,13 +415,14 @@ blockToLaTeX (Para [Image attr txt (src,'f':'i':'g':':':tit)]) = do
415415 else brackets <$> inlineListToLaTeX (walk deNote txt)
416416 img <- inlineToLaTeX (Image attr txt (src,tit))
417417 let footnotes = notesToLaTeX notes
418+ figure <- refLabel ident $ cr <>
419+ "\\begin{figure}[htbp]" $$ "\\centering" $$ img $$
420+ ("\\caption" <> captForLof <> braces capt) $$
421+ "\\end{figure}" <> cr
418422 return $ if inNote
419423 -- can't have figures in notes
420424 then "\\begin{center}" $$ img $+$ capt $$ "\\end{center}"
421− else "\\begin{figure}[htbp]" $$ "\\centering" $$ img $$
422− ("\\caption" <> captForLof <> braces capt) $$
423− "\\end{figure}" $$
424− footnotes
425+ else figure $$ footnotes
425426-- . . . indicates pause in beamer slides
426427blockToLaTeX (Para [Str ".",Space,Str ".",Space,Str "."]) = do
427428 beamer <- writerBeamer `fmap` gets stOptions
@@ -715,9 +716,8 @@ sectionHeader :: Bool -- True for unnumbered
715716 -> Int
716717 -> [Inline]
717718 -> State WriterState Doc
718−sectionHeader unnumbered ref level lst = do
719+sectionHeader unnumbered ident level lst = do
719720 txt <- inlineListToLaTeX lst
720− lab <- text `fmap` toLabel ref
721721 plain <- stringToLaTeX TextString $ foldl (++) "" $ map stringify lst
722722 let noNote (Note _) = Str ""
723723 noNote x = x
@@ -740,16 +740,6 @@ sectionHeader unnumbered ref level lst = do
740740 book <- gets stBook
741741 opts <- gets stOptions
742742 let level' = if book || writerChapters opts then level - 1 else level
743− internalLinks <- gets stInternalLinks
744− let refLabel x = (if ref `elem` internalLinks
745− then text "\\hypertarget"
746− <> braces lab
747− <> braces x
748− else x)
749− let headerWith x y = refLabel $ text x <> y <>
750− if null ref
751− then empty
752− else text "\\label" <> braces lab
753743 let sectionType = case level' of
754744 0 | writerBeamer opts -> "part"
755745 | otherwise -> "chapter"
@@ -765,16 +755,31 @@ sectionHeader unnumbered ref level lst = do
765755 -- needed for \paragraph, \subparagraph in quote environment
766756 -- see http://tex.stackexchange.com/questions/169830/
767757 else empty
758+ stuffing' <- refLabel ident $ text ('\\':sectionType) <> stuffing
768759 return $ if level' > 5
769760 then txt
770− else prefix $$
771− headerWith ('\\':sectionType) stuffing
761+ else prefix $$ stuffing'
772762 $$ if unnumbered
773763 then "\\addcontentsline{toc}" <>
774764 braces (text sectionType) <>
775765 braces txtNoNotes
776766 else empty
777767
768+-- | Append label to x and wrap in hypertarget
769+refLabel :: String -> Doc -> State WriterState Doc
770+refLabel ident x = do
771+ ref <- text `fmap` toLabel ident
772+ 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
782+
778783-- | Convert list of inline elements to LaTeX.
779784inlineListToLaTeX :: [Inline] -- ^ Inlines to convert
780785 -> State WriterState Doc