pandoc-crossref 0.3.20 → 0.3.21
raw patch · 45 files changed
+1722/−414 lines, 45 filesdep ~basedep ~containersdep ~data-defaultPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: base, containers, data-default, open-browser, optparse-applicative, pandoc
API changes (from Hackage documentation)
- Text.Pandoc.CrossRef.Internal: instance Control.Monad.Reader.Class.MonadReader Text.Pandoc.CrossRef.Internal.CrossRefEnv Text.Pandoc.CrossRef.Internal.CrossRefM
- Text.Pandoc.CrossRef.Internal: instance Control.Monad.State.Class.MonadState Text.Pandoc.CrossRef.References.Types.References Text.Pandoc.CrossRef.Internal.CrossRefM
+ Text.Pandoc.CrossRef: [creReferences] :: CrossRefEnv -> References
+ Text.Pandoc.CrossRef: subfigColumns :: ToMetaValue a => a -> Meta
+ Text.Pandoc.CrossRef.Internal: [creReferences] :: CrossRefEnv -> References
+ Text.Pandoc.CrossRef.Internal: instance Control.Monad.Reader.Class.MonadReader Text.Pandoc.Definition.Meta Text.Pandoc.CrossRef.Internal.CrossRefM
- Text.Pandoc.CrossRef: CrossRefEnv :: Meta -> Options -> CrossRefEnv
+ Text.Pandoc.CrossRef: CrossRefEnv :: Meta -> Options -> References -> CrossRefEnv
- Text.Pandoc.CrossRef.Internal: CrossRefEnv :: Meta -> Options -> CrossRefEnv
+ Text.Pandoc.CrossRef.Internal: CrossRefEnv :: Meta -> Options -> References -> CrossRefEnv
- Text.Pandoc.CrossRef.Internal: CrossRefM :: ReaderT CrossRefEnv (State References) a -> CrossRefM a
+ Text.Pandoc.CrossRef.Internal: CrossRefM :: ReaderT Meta WS a -> CrossRefM a
Files
- CHANGELOG.md +44/−0
- docs/demo/demo.md +9/−0
- docs/index.md +15/−2
- lib-internal/Text/Pandoc/CrossRef/References/Blocks.hs +29/−16
- lib-internal/Text/Pandoc/CrossRef/References/Blocks/CodeBlock.hs +6/−6
- lib-internal/Text/Pandoc/CrossRef/References/Blocks/Header.hs +15/−15
- lib-internal/Text/Pandoc/CrossRef/References/Blocks/Math.hs +6/−5
- lib-internal/Text/Pandoc/CrossRef/References/Blocks/Subfigures.hs +109/−74
- lib-internal/Text/Pandoc/CrossRef/References/Blocks/Table.hs +4/−4
- lib-internal/Text/Pandoc/CrossRef/References/Blocks/Util.hs +15/−16
- lib-internal/Text/Pandoc/CrossRef/References/List.hs +24/−28
- lib-internal/Text/Pandoc/CrossRef/References/Monad.hs +24/−3
- lib-internal/Text/Pandoc/CrossRef/References/Refs.hs +20/−26
- lib-internal/Text/Pandoc/CrossRef/References/Types.hs +8/−1
- lib-internal/Text/Pandoc/CrossRef/Util/CodeBlockCaptions.hs +3/−13
- lib-internal/Text/Pandoc/CrossRef/Util/Generic.hs +131/−0
- lib-internal/Text/Pandoc/CrossRef/Util/ModifyMeta.hs +10/−15
- lib-internal/Text/Pandoc/CrossRef/Util/Options.hs +2/−1
- lib-internal/Text/Pandoc/CrossRef/Util/Util.hs +0/−39
- lib/Text/Pandoc/CrossRef.hs +14/−25
- lib/Text/Pandoc/CrossRef/Internal.hs +9/−5
- pandoc-crossref.cabal +30/−14
- src/ManData.hs +1/−1
- test/demo-chapters.inc +118/−0
- test/demo.inc +118/−0
- test/m2m/equations-tables-auto/expect.md +8/−16
- test/m2m/listOfHidden/expect.tex +4/−4
- test/m2m/refsInListOf/expect.md +32/−0
- test/m2m/refsInListOf/expect.tex +42/−0
- test/m2m/refsInListOf/input.md +20/−0
- test/m2m/refsInObjects/expect.md +29/−0
- test/m2m/refsInObjects/expect.tex +49/−0
- test/m2m/refsInObjects/input.md +29/−0
- test/m2m/standalone-listOfMetadata/expect.md +245/−0
- test/m2m/standalone-listOfMetadata/expect.tex +144/−0
- test/m2m/standalone-listOfMetadata/input.md +70/−0
- test/m2m/subfigures-ccsDelim/expect.tex +18/−18
- test/m2m/subfigures-columns/expect.md +78/−0
- test/m2m/subfigures-columns/expect.tex +47/−0
- test/m2m/subfigures-columns/input.md +44/−0
- test/m2m/subfigures-grid/expect.tex +18/−18
- test/m2m/subfigures-one-row/expect.tex +4/−4
- test/m2m/subfigures/expect.tex +18/−18
- test/test-integrative.hs +14/−4
- test/test-pandoc-crossref.hs +45/−23
CHANGELOG.md view
@@ -1,3 +1,47 @@+## 0.3.21++### New features++- Switch to using `subcaption` for LaTeX subfigures++ `subfig` is reportedly deprecated and has some issues (e.g.+ [#182](https://github.com/lierdakil/pandoc-crossref/issues/182))++ This isn't as straightforward as one would like, there may be side effects.+ Please report any issues you encounter.++- Add subfigColumns option++ See <http://lierdakil.github.io/pandoc-crossref/#subfigure-columns> for more+ info++### Fixes++- Ensure automatic reference keys are unique++ Fixes edge case issues with list-of-stuff++- Properly render citations in list-of-stuff++### Maintenance++- Support Pandoc 3.8++- Minimal supported Pandoc version is 3.8++- Relax upper bounds on some dependencies:++ - containers+ - data-default+ - open-browser+ - optparse-applicative++- Large internal refactor to avoid explicit two-pass parse++ This isn't tested exhaustively, some edge case issues may or may not be+ present. As always, please report any issues you encounter, including+ non-termination and/or abnormal RAM consumption.+ ## 0.3.20 - Support Pandoc 3.7
docs/demo/demo.md view
@@ -12,6 +12,7 @@ *$$tableTitle$$ $$i$$*$$titleDelim$$ $$t$$ autoSectionLabels: True title: pandoc-crossref demo document+subfigColumns: True --- This is a demo file for pandoc-crossref. With this filter, you can cross-reference figures (see [@fig:figure1;@fig:figure2;@fig:figure3]), display equations (see @eq:eqn1), tables (see [@tbl:table1]) and sections ([@sec:sec1; @sec:sec2; @sec:caption-attr; @sec:table-capts; @sec:wrapping-div])@@ -48,6 +49,14 @@ {#fig:subfigureB} Subfigures caption+</div>++<div id="fig:subfigures-side-by-side">+++++Subfigures side by side </div> # Chapter 2. Equations {#sec:sec2}
docs/index.md view
@@ -183,7 +183,7 @@ If you put more than one figure in the paragraph, those will still be rendered, but Pandoc will omit subfigure caption in most outputs (but it will work as expected with LaTeX). You can use output-specific hacks to-work around that, or use `subfigGrid` (see below).+work around that, or use `subfigGrid` or `subfigColumn` (see below). Output is customizable, with metadata fields. See [Customization](#customization) for more information.@@ -263,6 +263,17 @@ don't need `subfigGrid` enabled for it to work with LaTeX, but you can still enable it. +#### Subfigure columns++Similar to `subfigGrid`, `subfigColumns` option will align each subfigure row as+Pandoc's columns environment. This primarily works well with HTML output.++All the caveats applicable to `subfigGrid` are equally applicable to+`subfigColumns` as well.++`subfigGrid` and `subfigColumns` are mutually exclusive. If both are specified,+the former takes precedence.+ ## Equation labels ``` markdown@@ -677,7 +688,7 @@ - `listings`: if True, generate code blocks for `listings` package. Only relevant for LaTeX output. `\usepackage{listings}` will be automatically added to `header-includes`. You need to specify- `--listings` option as well.+ `--syntax-highlighting=idiomatic` option as well. - `codeBlockCaptions`: if True, parse table-style code block captions. - `autoSectionLabels`, default `false`: Automatically prefix all section labels with `sec:`. Note that this messes with pandoc's@@ -722,6 +733,8 @@ [Subfigures](#subfigures) and [Templates](#templates) - `subfigGrid`, default `false`. If true, typeset subfigures inside a table. Ignored with LaTeX output. See [Subfigures](#subfigures)+- `subfigColumns`, default `false`. If true, typeset subfigure rows as column+ environment. Ignored with LaTeX output. See [Subfigures](#subfigures) ### List titles
lib-internal/Text/Pandoc/CrossRef/References/Blocks.hs view
@@ -22,7 +22,7 @@ ( replaceAll ) where -import Control.Monad.Reader+import Lens.Micro.Mtl import Data.List import qualified Data.Text as T import Lens.Micro@@ -30,6 +30,7 @@ import Text.Pandoc.Shared (blocksToInlines) import Text.Pandoc.CrossRef.References.Types+import Text.Pandoc.CrossRef.References.List import Text.Pandoc.CrossRef.References.Blocks.CodeBlock import Text.Pandoc.CrossRef.References.Blocks.Header import Text.Pandoc.CrossRef.References.Blocks.Math@@ -37,22 +38,24 @@ import Text.Pandoc.CrossRef.References.Blocks.Table import Text.Pandoc.CrossRef.References.Blocks.Util import Text.Pandoc.CrossRef.References.Monad+import Text.Pandoc.CrossRef.Util.CodeBlockCaptions import Text.Pandoc.CrossRef.Util.Options+import Text.Pandoc.CrossRef.Util.Generic import Text.Pandoc.CrossRef.Util.Util replaceAll :: (Data a) => a -> WS a replaceAll x = do- opts <- ask- x & runReplace (mkRR replaceBlock- `extRR` replaceInlineMany- )- . runSplitMath opts- . everywhere (mkT divBlocks `extT` spanInlines opts)+ opts <- use wsOptions+ x & everywhere (mkT (spanInlines opts) `extT` doSplitMath opts) -- bottom-up pass+ & runReplace (mkRR replaceBlock -- top-down pass+ `extRR` replaceInlineMany+ `extRR` replaceBlockMany+ ) where- runSplitMath opts+ doSplitMath opts | tableEqns opts , not $ isLatexFormat opts- = everywhere (mkT splitMath)+ = splitMath | otherwise = id extractCaption :: Block -> Maybe [Inline]@@ -94,14 +97,14 @@ = runCodeBlock (label, nub $ divClasses <> cbClasses, divAttrs <> cbAttrs) code $ Right caption replaceBlock (Para [Span attr [Math DisplayMath eq]]) = runBlockMath attr eq-replaceBlock _ = noReplaceRecurse+replaceBlock x = maybe noReplaceRecurse replaceBlock $ divBlocks x replaceInlineMany :: [Inline] -> WS (ReplacedResult [Inline]) replaceInlineMany (Span spanAttr@(label,clss,attrs) [Math DisplayMath eq]:xs) = do- opts <- ask+ opts <- use wsOptions if label `hasPfx` PfxEqn || T.null label && autoEqnLabels opts then do- replaceRecurse . (<> xs) =<< if isLatexFormat opts+ res <- if isLatexFormat opts then pure [RawInline (Format "latex") "\\begin{equation}" , Span spanAttr [RawInline (Format "latex") eq]@@ -109,18 +112,28 @@ else do ReplaceEqn{replaceEqnEq, replaceEqnIdx} <- replaceEqn eqnDisplayTemplate spanAttr eq pure [Span (label,clss,setLabel opts replaceEqnIdx attrs) replaceEqnEq]+ replaceList res xs else noReplaceRecurse-replaceInlineMany _ = noReplaceRecurse+replaceInlineMany (x:xs) = fixRefs' x xs+replaceInlineMany [] = noReplaceRecurse -divBlocks :: Block -> Block+replaceBlockMany :: [Block] -> WS (ReplacedResult [Block])+replaceBlockMany bs@(x:xs) = do+ opts <- use wsOptions+ case mkCodeBlockCaptions opts bs of+ Just res' -> replaceRecurse res'+ Nothing -> liftF (listOf x opts) `fixRefs` xs+replaceBlockMany [] = noReplaceRecurse++divBlocks :: Block -> Maybe Block divBlocks (Table tattr (Caption short (btitle:rest)) colspec header cells foot) | not $ null title , Just label <- getRefLabel PfxTbl [last title]- = Div (label,[],[]) [+ = Just $ Div (label,[],[]) [ Table tattr (Caption short $ walkReplaceInlines (dropWhileEnd isSpace (init title)) title btitle:rest) colspec header cells foot] where title = blocksToInlines [btitle]-divBlocks x = x+divBlocks _ = Nothing spanInlines :: Options -> [Inline] -> [Inline] spanInlines opts (math@(Math DisplayMath _eq):ils)
lib-internal/Text/Pandoc/CrossRef/References/Blocks/CodeBlock.hs view
@@ -20,7 +20,7 @@ module Text.Pandoc.CrossRef.References.Blocks.CodeBlock where -import Control.Monad.Reader.Class+import Lens.Micro.Mtl import qualified Data.Text as T import Text.Pandoc.Definition import qualified Text.Pandoc.Builder as B@@ -30,11 +30,11 @@ import Text.Pandoc.CrossRef.References.Blocks.Util import Text.Pandoc.CrossRef.Util.Options import Text.Pandoc.CrossRef.Util.Template-import Text.Pandoc.CrossRef.Util.Util+import Text.Pandoc.CrossRef.Util.Generic runCodeBlock :: Attr -> T.Text -> Either T.Text [Inline] -> WS (ReplacedResult Block) runCodeBlock (label, classes, attrs) code eCaption = do- opts <- ask+ opts <- use wsOptions --if used with listings package,nothing should be done if | isLatexFormat opts, listings opts -> do let cap = either (B.toList . B.text) id eCaption@@ -47,8 +47,8 @@ | isLatexFormat opts -> do let cap = either (B.toList . B.text) id eCaption ref <- replaceAttr (Just label) attrs cap SPfxLst- replaceNoRecurse $ Div nullAttr [- RawBlock (Format "latex") $ "\\begin{codelisting}"+ replaceRecurse $ Div nullAttr [+ RawBlock (Format "latex") "\\begin{codelisting}" , Plain $ latexCaption ref , CodeBlock ("", classes, attrs) code , RawBlock (Format "latex") "\\end{codelisting}"@@ -58,7 +58,7 @@ ref <- replaceAttr (Just label) attrs cap SPfxLst idxStr <- chapIndex ref let caption' = applyTemplate idxStr cap $ listingTemplate opts- replaceNoRecurse $ Div (label, "listing":classes, []) [+ replaceRecurse $ Div (label, "listing":classes, []) [ mkCaption opts "Caption" caption' , CodeBlock ("", classes, filter ((/="caption") . fst) $ setLabel opts idxStr attrs) code ]
lib-internal/Text/Pandoc/CrossRef/References/Blocks/Header.hs view
@@ -20,7 +20,8 @@ module Text.Pandoc.CrossRef.References.Blocks.Header where -import Control.Monad.Reader.Class+import Control.Applicative+import Lens.Micro.Mtl import Control.Monad (when) import qualified Data.Map as M import qualified Data.Sequence as S@@ -29,35 +30,34 @@ import Text.Pandoc.Definition import Text.Read (readMaybe) -import Control.Applicative-import Lens.Micro.Mtl import Text.Pandoc.CrossRef.References.Types import Text.Pandoc.CrossRef.References.Monad import Text.Pandoc.CrossRef.References.Blocks.Util (setLabel, checkHidden) import Text.Pandoc.CrossRef.Util.Options import Text.Pandoc.CrossRef.Util.Template import Text.Pandoc.CrossRef.Util.Util+import Text.Pandoc.CrossRef.Util.Generic runHeader :: Int -> Attr -> [Inline] -> WS (ReplacedResult Block) runHeader n (label, cls, attrs) text' = do- stHiddenHeaderLevel %= filter \HiddenHeader{hhLevel} -> hhLevel < n+ wsReferences . stHiddenHeaderLevel %= filter \HiddenHeader{hhLevel} -> hhLevel < n hhHidden <- checkHidden attrs- stHiddenHeaderLevel %= (HiddenHeader { hhLevel = n, hhHidden }:)+ wsReferences . stHiddenHeaderLevel %= (HiddenHeader { hhLevel = n, hhHidden }:) if "unnumbered" `elem` cls then do label' <- mangleLabel- replaceNoRecurse $ Header n (label', cls, attrs) text'+ replaceRecurse $ Header n (label', cls, attrs) text' else do- opts@Options{..} <- ask+ opts@Options{..} <- use wsOptions label' <- mangleLabel- ctrsAt PfxSec %= \cc ->+ wsReferences . ctrsAt PfxSec %= \cc -> let ln = length cc cl i = lookup "label" attrs <|> customHeadingLabel n i <|> customLabel (Pfx PfxSec) i inc l = case S.viewr l of EmptyR -> error "impossible" init' :> last' ->- let i = succ $ fst $ last'+ let i = succ $ fst last' in init' S.|> (i, cl i) cc' | Just num <- readMaybe . T.unpack =<< lookup "number" attrs = S.take (n - 1) cc S.|> (num, cl num)@@ -68,10 +68,10 @@ | numberSections = S.replicate (n-ln-1) (1, Nothing) | otherwise = S.replicate (n-ln-1) (0, Nothing) in cc'- cc <- use $ ctrsAt PfxSec- globCtr <- stGlob <<%= (+ 1)+ cc <- use $ wsReferences . ctrsAt PfxSec+ globCtr <- wsReferences . stGlob <<%= (+ 1) when (label' `hasPfx` PfxSec) $- refsAt PfxSec %= M.insert label' RefRec {+ wsReferences . refsAt PfxSec %= M.insert (IdxRef PfxSec label') RefRec { refIndex = cc , refGlobal = globCtr , refTitle = text'@@ -87,14 +87,14 @@ ("i", idxStr) , ("n", [Str $ T.pack $ show $ n - 1]) , ("t", text')- ]) $ secHeaderTemplate+ ]) secHeaderTemplate | otherwise = text' idxStr = chapPrefix chapDelim cc attrs' = setLabel opts idxStr attrs- replaceNoRecurse $ Header n (label', cls, attrs') textCC+ replaceRecurse $ Header n (label', cls, attrs') textCC where mangleLabel = do- Options{autoSectionLabels} <- ask+ Options{autoSectionLabels} <- use wsOptions pure $ if autoSectionLabels && not (label `hasPfx` PfxSec) then pfxTextCol PfxSec <> label
lib-internal/Text/Pandoc/CrossRef/References/Blocks/Math.hs view
@@ -20,7 +20,7 @@ module Text.Pandoc.CrossRef.References.Blocks.Math where -import Control.Monad.Reader.Class+import Lens.Micro.Mtl import qualified Data.Map as M import qualified Data.Text as T import Text.Pandoc.Definition@@ -31,14 +31,15 @@ import Text.Pandoc.CrossRef.Util.Options import Text.Pandoc.CrossRef.Util.Template import Text.Pandoc.CrossRef.Util.Util+import Text.Pandoc.CrossRef.Util.Generic runBlockMath :: Attr -> T.Text -> WS (ReplacedResult Block) runBlockMath (label, cls, attrs) eq = do- opts <- ask+ opts <- use wsOptions if tableEqns opts && not (isLatexFormat opts) then do ReplaceEqn{..} <- replaceEqn eqnBlockTemplate (label, cls, attrs) eq- replaceNoRecurse $ Div (label,cls,setLabel opts replaceEqnIdx attrs) replaceEqnEq+ replaceRecurse $ Div (label,cls,setLabel opts replaceEqnIdx attrs) replaceEqnEq else noReplaceRecurse data ReplaceEqn a = ReplaceEqn@@ -48,7 +49,7 @@ replaceEqn :: MkTemplate a t => (Options -> t) -> Attr -> T.Text -> WS (ReplaceEqn a) replaceEqn eqTemplate (label, _, attrs) eq = do- opts <- ask+ opts <- use wsOptions let label' | T.null label = Nothing | otherwise = Just label ref <- replaceAttr label' attrs [] SPfxEqn@@ -60,7 +61,7 @@ then eqnInlineTableTemplate opts else eqnInlineTemplate opts wrapMath x = [Math mathfmt $ stringify x]- commonVars eqn = M.fromList $+ commonVars eqn = M.fromList [ ("e", eqn) , ("t", eqn) -- backwards compatibility for eqnBlockTemplate , ("i", wrapMath idxStr)
lib-internal/Text/Pandoc/CrossRef/References/Blocks/Subfigures.hs view
@@ -20,8 +20,6 @@ module Text.Pandoc.CrossRef.References.Blocks.Subfigures where -import Control.Monad.Reader-import Control.Monad.State hiding (get, modify) import qualified Data.Map as M import qualified Data.Text as T import qualified Data.Text.Read as T@@ -33,7 +31,6 @@ import Lens.Micro import Lens.Micro.Mtl import Text.Pandoc.Shared (blocksToInlines)-import Control.Monad ((<=<)) import Text.Pandoc.CrossRef.References.Types import Text.Pandoc.CrossRef.References.Monad@@ -41,32 +38,28 @@ import Text.Pandoc.CrossRef.Util.Options import Text.Pandoc.CrossRef.Util.Template import Text.Pandoc.CrossRef.Util.Util+import Text.Pandoc.CrossRef.Util.Generic runSubfigures :: Attr -> [Block] -> [Inline] -> WS (ReplacedResult Block) runSubfigures (label, cls, attrs) images caption = do- opts <- ask+ opts <- use wsOptions ref <- replaceAttr (Just label) attrs caption SPfxImg idxStr <- chapIndex ref- glob <- use stGlob- hiddenHdr <- use stHiddenHeaderLevel- let (cont, st) = flip runState (References def def glob hiddenHdr)- $ flip runReaderT opts'- $ runWS- $ runReplace (mkRR replaceSubfigs `extRR` doFigure) images- doFigure :: Block -> WS (ReplacedResult Block)- doFigure (Figure attr caption' content) = runFigure True attr caption' content- doFigure _ = noReplaceRecurse- opts' = opts+ glob <- use $ wsReferences . stGlob+ hiddenHdr <- use $ wsReferences . stHiddenHeaderLevel+ let opts' = opts { figureTemplate = subfigureChildTemplate opts- , customLabel = \r i -> customLabel opts (Sub r) i+ , customLabel = customLabel opts . Sub }- collectedCaptions = B.toList $+ (cont, st) <- embedWS (WState opts' (References def def glob hiddenHdr))+ $ runReplace (mkRR replaceSubfigs) images+ let collectedCaptions = B.toList $ intercalate' (B.fromList $ ccsDelim opts) $ map (B.fromList . collectCaps . snd) $ sortOn (refIndex . snd) $ filter (not . null . refTitle . snd) $ M.toList- $ st ^. refsAt PfxImg+ $ st ^. wsReferences . refsAt PfxImg collectCaps v = applyTemplate (chapPrefix (chapDelim opts) (refIndex v))@@ -78,56 +71,48 @@ , ("t", caption) ] capt = applyTemplate' vars $ subfigureTemplate opts- lastRef <- fromJust . M.lookup label <$> use (refsAt PfxImg)- let mangledSubfigures = mangleSubfigure <$> st ^. refsAt PfxImg- mangleSubfigure v = v{refIndex = refIndex lastRef, refSubfigure = Just $ refIndex v}- refsAt PfxImg %= (<> mangledSubfigures)- stGlob .= st ^. stGlob+ let mangledSubfigures = mangleSubfigure <$> st ^. wsReferences . refsAt PfxImg+ mangleSubfigure v = v{refIndex = refIndex ref, refSubfigure = Just $ refIndex v}+ wsReferences . refsAt PfxImg %= (<> mangledSubfigures)+ wsReferences . stGlob .= st ^. wsReferences . stGlob -- stHiddenHeaderLevel shouldn't have changed, but for future-proofing...- stHiddenHeaderLevel .= st ^. stHiddenHeaderLevel- if | isLatexFormat opts -> do- replaceNoRecurse $ Div nullAttr $- [ RawBlock (Format "latex") "\\begin{pandoccrossrefsubfigures}" ]- <> cont <>- [ Para $ latexCaption ref- , RawBlock (Format "latex") "\\end{pandoccrossrefsubfigures}"]- | otherwise ->- replaceNoRecurse- $ Figure (label, "subfigures":cls, setLabel opts idxStr attrs)- (Caption Nothing [Para capt])- $ toTable opts cont+ wsReferences . stHiddenHeaderLevel .= st ^. wsReferences . stHiddenHeaderLevel+ replaceNoRecurse $ if isLatexFormat opts+ then Div nullAttr $+ [ RawBlock (Format "latex") "\\begin{pandoccrossrefsubfigures}" ]+ <> cont <>+ [ Para $ latexCaption ref+ , RawBlock (Format "latex") "\\end{pandoccrossrefsubfigures}"]+ else Figure (label, "subfigures":cls, setLabel opts idxStr attrs)+ (Caption Nothing [Para capt])+ $ toTable opts cont where toTable :: Options -> [Block] -> [Block] toTable opts blks- | subfigGrid opts = [simpleTable align (map ColWidth widths) (map (fmap pure . blkToRow) blks)]+ | subfigGrid opts = [simpleTable align (map ColWidth widths') (map (fmap pure . blkToRow) blks)]+ | subfigColumns opts = mapMaybe figurize blks | otherwise = blks where+ figurize x+ | Para is <- x = case (mapMaybe getImg is) `zip` widths' of+ [] -> Nothing -- skip empty Paras+ [_] -> error "The impossible happened: single-element Para in \+ \subfigure which is not a figure"+ xs -> Just $ Div ("", ["columns"], []) $ map columnize xs+ | otherwise = Just x+ columnize ((id', cs, as, alt, tgt), width) =+ Div ("", ["column"], [("width", T.pack (show (width * 100.0)) <> "%")]) [+ implicitFigure (id', cs, filter ((/="width") . fst) as) alt tgt Figure+ ]+ widths' = widths blks align | b:_ <- blks = let ils = blocksToInlines [b] in replicate (length $ mapMaybe getWidth ils) AlignCenter | otherwise = error "Misformatted subfigures block"- widths | b:_ <- blks = let ils = blocksToInlines [b] in fixZeros $ mapMaybe getWidth ils- | otherwise = error "Misformatted subfigures block"- getWidth (Image (_id, _class, as) _ _)- = Just $ maybe 0 percToDouble $ lookup "width" as- getWidth _ = Nothing- fixZeros :: [Double] -> [Double]- fixZeros ws- = let nz = length $ filter (== 0) ws- rzw = (0.99 - sum ws) / fromIntegral nz- in if nz>0- then map (\x -> if x == 0 then rzw else x) ws- else ws- percToDouble :: T.Text -> Double- percToDouble percs- | Right (perc, "%") <- T.double percs- = perc/100.0- | otherwise = error "Only percent allowed in subfigure width!" blkToRow :: Block -> [Block]- blkToRow (Para inls) = zipWith inlToCell widths $ mapMaybe getImg inls+ blkToRow (Para inls) = zipWith inlToCell widths' $ mapMaybe getImg inls blkToRow x = [x] getImg (Image (id', cs, as) txt tgt) = Just (id', cs, as, txt, tgt) getImg _ = Nothing- inlToCell w (id', cs, as, txt, tgt) =- Figure (id', cs, []) (Caption Nothing [Para txt]) [Plain [Image ("", cs, setW w as) txt tgt]]+ inlToCell w (id', cs, as, txt, tgt) = implicitFigure (id', cs, setW w as) txt tgt Figure setW w as = ("width", width):filter ((/="width") . fst) as where -- With docx, since pandoc 3.0, 100% is interpreted as "page width",@@ -136,37 +121,87 @@ | isDocxFormat opts = T.pack (show $ w * 100) <> "%" | otherwise = "100%" -replaceSubfigs :: [Inline] -> WS (ReplacedResult [Inline])-replaceSubfigs = (replaceNoRecurse . concat) <=< mapM replaceSubfig+getWidth :: Inline -> Maybe Double+getWidth (Image (_id, _class, as) _ _)+ = Just $ maybe 0 percToDouble $ lookup "width" as+ where+ percToDouble :: T.Text -> Double+ percToDouble percs+ | Right (perc, "%") <- T.double percs+ = perc/100.0+ | otherwise = error "Only percent allowed in subfigure width!"+getWidth _ = Nothing -replaceSubfig :: Inline -> WS [Inline]-replaceSubfig x@(Image (label,cls,attrs) alt tgt) = do- opts <- ask+widths :: [Block] -> [Double]+widths (b:_) = let ils = blocksToInlines [b] in fixZeros $ mapMaybe getWidth ils+ where+ fixZeros :: [Double] -> [Double]+ fixZeros ws+ = let nz = length $ filter (== 0) ws+ rzw = (0.99 - sum ws) / fromIntegral nz+ in if nz>0+ then map (\x -> if x == 0 then rzw else x) ws+ else ws+widths _ = error "Misformatted subfigures block"++replaceSubfigs :: Block -> WS (ReplacedResult Block)+replaceSubfigs (Figure attr caption' content) = runFigure True attr caption' content+-- this triggers when implicit_figures is disabled+replaceSubfigs (Para [Image attr caption' tgt]) =+ implicitFigure attr caption' tgt $ runFigure True+replaceSubfigs blk@(Para images) =+ let go _ [] = pure []+ go (w:ws) (x@Image{}:xs) = liftA2 (:) (replaceSubfig w x) (go ws xs)+ go ws (x:xs) = ([x] :) <$> go ws xs+ in replaceNoRecurse . Para . concat =<< go (widths [blk]) images+replaceSubfigs _ = noReplaceRecurse++-- this is mostly copy-paste from pandoc markdown reader+implicitFigure :: Attr -> [Inline] -> (T.Text, T.Text) -> (Attr -> Caption -> [Block] -> a) -> a+implicitFigure (ident, classes, attribs) capt' (url, title) f =+ let alt = maybe capt B.text $ lookup "alt" attribs+ capt = B.fromList capt'+ attribs' = filter (liftA2 (&&) (/= "latex-placement") (/= "alt") . fst) attribs+ figattribs = filter ((=="latex-placement") . fst) attribs+ figattr = (ident, mempty, figattribs)+ caption = B.simpleCaption $ B.plain capt+ figbody = B.plain $ B.imageWith ("", classes, attribs') url title alt+ in f figattr caption (B.toList figbody)++replaceSubfigs' :: [(Double, Inline)] -> WS [Inline]+replaceSubfigs' = fmap concat . mapM (uncurry replaceSubfig)++replaceSubfig :: Double -> Inline -> WS [Inline]+replaceSubfig width x@(Image (label,cls,attrs) alt tgt) = do+ opts <- use wsOptions ref <- replaceAttr (normalizeLabel label) attrs alt SPfxImg idxStr <- chapIndex ref let alt' = applyTemplate idxStr alt $ figureTemplate opts pure $ if isLatexFormat opts- then latexSubFigure x ref+ then latexSubFigure width x ref else [Image (fromMaybe "" (refLabel ref), cls, setLabel opts idxStr attrs) alt' tgt]-replaceSubfig x = pure [x]+replaceSubfig _ _ = pure [] -latexSubFigure :: Inline -> RefRec -> [Inline]-latexSubFigure (Image (_, cls, attrs) alt (src, title)) ref =+latexSubFigure :: Double -> Inline -> RefRec -> [Inline]+latexSubFigure width (Image (_, cls, attrs) alt (src, title)) ref = let title' = fromMaybe title $ T.stripPrefix "fig:" title texalt | "nocaption" `elem` cls = [] | otherwise = concat- [ [ RawInline (Format "latex") "["]+ [ [ RawInline (Format "latex") "\\caption{"] , alt- , [ RawInline (Format "latex") "]"]+ , latexLabel ref+ , [ RawInline (Format "latex") "}"] ]- img = Image (fromMaybe "" (refLabel ref), cls, attrs) alt (src, title')+ filterWidth = filter $ (/= "width") . fst+ img = Image (fromMaybe "" (refLabel ref), cls, filterWidth attrs) alt (src, title') in concat [- [ RawInline (Format "latex") "\\subfloat" ]+ [ RawInline (Format "latex") ("\\begin{subfigure}{" <> T.pack (show width) <> "\\linewidth}") ]+ , [ img ] , texalt- , [Span nullAttr $ img : latexLabel ref]+ , [RawInline (Format "latex") "\\end{subfigure}%\n"] ]-latexSubFigure x _ = [x]+latexSubFigure _ x _ = [x] normalizeLabel :: T.Text -> Maybe T.Text normalizeLabel label@@ -179,14 +214,14 @@ where mkBody xs = TableBody nullAttr (RowHeadColumns 0) [] (map mkRow xs) mkRow xs = Row nullAttr (map mkCell xs)- mkCell xs = Cell nullAttr AlignDefault (RowSpan 1) (ColSpan 1) xs+ mkCell = Cell nullAttr AlignDefault (RowSpan 1) (ColSpan 1) noCaption = Caption Nothing mempty noTableHead = TableHead nullAttr [] noTableFoot = TableFoot nullAttr [] runFigure :: Bool -> Attr -> Caption -> [Block] -> WS (ReplacedResult Block) runFigure subFigure (label, cls, fattrs) (Caption short (btitle : rest)) content = do- opts <- ask+ opts <- use wsOptions let label' = normalizeLabel label let title = blocksToInlines [btitle] (attrs, content') = case blocksToInlines content of@@ -207,7 +242,7 @@ replaceNoRecurse $ if subFigure && isLatexFormat opts then Plain $ case blocksToInlines content of- ctHead:_ -> latexSubFigure ctHead ref+ ctHead:_ -> latexSubFigure 1.0 ctHead ref _ -> error "The impossible happened: empty content in subfigures" else Figure (label,cls,setLabel opts idxStr fattrs) caption' (content' title')-runFigure _ _ _ _ = noReplaceNoRecurse+runFigure _ _ _ _ = noReplaceRecurse
lib-internal/Text/Pandoc/CrossRef/References/Blocks/Table.hs view
@@ -20,7 +20,7 @@ module Text.Pandoc.CrossRef.References.Blocks.Table where -import Control.Monad.Reader.Class+import Lens.Micro.Mtl import Text.Pandoc.Definition import Text.Pandoc.Shared (blocksToInlines) import Data.Function ((&))@@ -30,11 +30,11 @@ import Text.Pandoc.CrossRef.References.Types import Text.Pandoc.CrossRef.Util.Options import Text.Pandoc.CrossRef.Util.Template-import Text.Pandoc.CrossRef.Util.Util+import Text.Pandoc.CrossRef.Util.Generic runTable :: Attr -> Maybe Attr -> Maybe ShortCaption -> Block -> [Block] -> [ColSpec] -> TableHead -> [TableBody] -> TableFoot -> WS (ReplacedResult Block) runTable (label, clss, attrs) mtattr short btitle rest colspec header cells foot = do- opts <- ask+ opts <- use wsOptions ref <- replaceAttr (Just label) attrs title SPfxTbl idxStr <- chapIndex ref let short' | refHideFromList ref = Just mempty@@ -45,7 +45,7 @@ caption' = Caption short' (walkReplaceInlines title' title btitle:rest) label' | isLatexFormat opts = "" | otherwise = label- replaceNoRecurse $ (mtattr &+ replaceRecurse $ (mtattr & maybe (Table (label, clss, setLabel opts idxStr attrs)) (\tattr a b c d -> Div (label', clss, setLabel opts idxStr attrs) . pure . Table tattr a b c d)
lib-internal/Text/Pandoc/CrossRef/References/Blocks/Util.hs view
@@ -31,13 +31,12 @@ , walkReplaceInlines ) where -import Control.Monad.Reader.Class import qualified Data.Map as M import qualified Data.Set as Set import Data.Set (Set) import qualified Data.Text as T import Text.Pandoc.Definition-import Text.Pandoc.Shared (stringify)+import Text.Pandoc.Shared (stringify, deNote) import Text.Pandoc.Walk (walk) import Control.Monad (when) import Data.Maybe (fromMaybe)@@ -46,7 +45,6 @@ import Control.Applicative import Lens.Micro.Mtl-import Text.Pandoc.Shared (deNote) import Text.Pandoc.CrossRef.References.Types import Text.Pandoc.CrossRef.References.Monad import Text.Pandoc.CrossRef.Util.Options@@ -93,21 +91,22 @@ replaceAttr label attrs title (toPrefix -> pfx) = do let refLabel = lookup "label" attrs number = readMaybe . T.unpack =<< lookup "number" attrs- Options{..} <- ask- chap <- S.take chaptersDepth <$> use (ctrsAt PfxSec)- prop' <- use $ refsAt pfx- curIdx <- use $ ctrsAt pfx+ Options{..} <- use wsOptions+ chap <- S.take chaptersDepth <$> use (wsReferences . ctrsAt PfxSec)+ prop' <- use $ wsReferences . refsAt pfx+ curIdx <- use $ wsReferences . ctrsAt pfx+ globCtr <- wsReferences . stGlob <<%= (+ 1) let i | Just n <- number = n | chap' :> last' <- S.viewr curIdx , chap' == chap = succ . fst $ last' | otherwise = 1 index = chap S.|> (i, refLabel <|> customLabel (Pfx pfx) i)- label' = fromMaybe (T.pack (show pfx <> (':' : show index))) label+ synthLabel = IdxSynth globCtr+ label' = fromMaybe synthLabel $ IdxRef pfx <$> label when (M.member label' prop') $- error . T.unpack $ "Duplicate label: " <> label'- globCtr <- stGlob <<%= (+ 1)- ctrsAt pfx .= index+ error $ "Duplicate label: " <> displayIdx label'+ wsReferences . ctrsAt pfx .= index refHideFromList <- checkHidden attrs let rec' = RefRec { refIndex= index@@ -117,12 +116,12 @@ , refHideFromList , refLabel = label }- refsAt pfx %= M.insert label' rec'+ wsReferences . refsAt pfx %= M.insert label' rec' pure rec' chapIndex :: RefRec -> WS [Inline] chapIndex r = do- Options{chapDelim} <- ask+ Options{chapDelim} <- use wsOptions pure $ chapPrefix chapDelim $ refIndex r mkCaption :: Options -> T.Text -> [Inline] -> Block@@ -180,9 +179,9 @@ checkHidden :: [(T.Text, T.Text)] -> WS Bool checkHidden attrs = do- hiddenHdr <- use stHiddenHeaderLevel- pure . fromMaybe (isHdrHidden hiddenHdr) $- not . isFalseValue <$> lookup "hidden" attrs+ hiddenHdr <- use $ wsReferences . stHiddenHeaderLevel+ pure $ maybe (isHdrHidden hiddenHdr) (not . isFalseValue)+ $ lookup "hidden" attrs isFalseValue :: T.Text -> Bool isFalseValue = (`Set.member` falseValues) . T.strip . T.toLower
lib-internal/Text/Pandoc/CrossRef/References/List.hs view
@@ -21,35 +21,29 @@ module Text.Pandoc.CrossRef.References.List (listOf, listOfFigures, listOfTables, listOfListings) where import Data.List-import Control.Monad.Reader import qualified Data.Map as M import Text.Pandoc.Definition import Text.Pandoc.Builder qualified as B-import Data.Maybe -import Lens.Micro.Mtl+import Lens.Micro import Text.Pandoc.CrossRef.References.Types-import Text.Pandoc.CrossRef.References.Monad+import Text.Pandoc.CrossRef.Util.Generic import Text.Pandoc.CrossRef.Util.Options import Text.Pandoc.CrossRef.Util.Util import Text.Pandoc.CrossRef.Util.Template -listOf :: [Block] -> WS [Block]-listOf blocks = asks isLatexFormat >>= \case- True -> pure blocks- False -> case blocks of- (RawBlock fmt "\\listoffigures":xs)- | isLaTeXRawBlockFmt fmt- -> (<> xs) <$> listOfFigures- (RawBlock fmt "\\listoftables":xs)- | isLaTeXRawBlockFmt fmt- -> (<> xs) <$> listOfTables- (RawBlock fmt "\\listoflistings":xs)- | isLaTeXRawBlockFmt fmt- -> (<> xs) <$> listOfListings- _ -> pure blocks+listOf :: Block -> Options -> References -> Maybe [Block]+listOf _ opts | isLatexFormat opts = pure Nothing+listOf (RawBlock fmt content) opts | isLaTeXRawBlockFmt fmt =+ case content of+ "\\listoffigures" -> Just <$> listOfFigures opts+ "\\listoftables" -> Just <$> listOfTables opts+ "\\listoflistings" -> Just <$> listOfListings opts+ _ -> pure Nothing+listOf _ _ = pure Nothing -listOfFigures, listOfTables, listOfListings:: WS [Block]++listOfFigures, listOfTables, listOfListings:: Options -> References -> [Block] listOfFigures = makeList PfxImg lofItemTemplate lofTitle listOfTables = makeList PfxTbl lotItemTemplate lotTitle listOfListings = makeList PfxLst lolItemTemplate lolTitle@@ -58,12 +52,13 @@ :: Prefix -> (Options -> BlockTemplate) -> (Options -> [Block])- -> WS [Block]-makeList pfx tf titlef = do- o <- ask- refs <- use $ refsAt pfx+ -> Options+ -> References+ -> [Block]+makeList pfx tf titlef o refsMap = do let- items = fromMaybe items' $ pure <$> mergeList Nothing [] items'+ refs = refsMap ^. refsAt pfx+ items = maybe items' pure $ mergeList Nothing [] items' items' = concatMap (itemChap . snd) refsSorted mergeList Nothing acc (OrderedList style item : ys) = mergeList (Just $ OrderedList style) (item <> acc) ys@@ -85,16 +80,17 @@ = compare i j itemChap :: RefRec -> [Block] itemChap ref@RefRec{..} =- let vars = M.fromDistinctAscList $+ let vars = M.fromDistinctAscList [ ("i", numWithChap vars ref)- , ("lt", linked refLabel refTitle)+ , ("lt", linked refLabel title) , ("ri", chapPrefix chapDelim refIndex) , ("s", maybe mempty (chapPrefix chapDelim) refSubfigure) , ("suf", mempty)- , ("t", refTitle)+ , ("t", title) ] in applyTemplate' vars $ tf o where+ title = replaceRefsWalk o refsMap refTitle Options{chapDelim} = o linked (Just lab) = B.toList . B.link ("#" <> lab) "" . B.fromList linked Nothing = id@@ -104,4 +100,4 @@ where vars' = M.insert "i" (chapPrefix chapDelim refIndex) vars Options{chapDelim, refIndexTemplate, subfigureRefIndexTemplate} = o- pure $ titlef o <> [Div ("", ["list", "list-of-" <> pfxText pfx], []) items]+ titlef o <> [Div ("", ["list", "list-of-" <> pfxText pfx], []) items]
lib-internal/Text/Pandoc/CrossRef/References/Monad.hs view
@@ -21,10 +21,31 @@ module Text.Pandoc.CrossRef.References.Monad where import Control.Monad.State-import Control.Monad.Reader+import Data.Function import Text.Pandoc.CrossRef.References.Types import Text.Pandoc.CrossRef.Util.Options+import Lens.Micro.TH+import Lens.Micro.Extras +data WState = WState+ { _wsOptions :: Options+ , _wsReferences :: References+ }++makeLenses ''WState+ --state monad-newtype WS a = WS { runWS :: ReaderT Options (State References) a }- deriving (Functor, Applicative, Monad, MonadReader Options, MonadState References)+newtype WS a = WS (StateT WState ((->) References) a)+ deriving (Functor, Applicative, Monad, MonadState WState)++unwrapWS :: WS a -> WState -> References -> (a, WState)+unwrapWS (WS a) = runStateT a++embedWS :: WState -> WS a -> WS (a, WState)+embedWS wst a = WS $ StateT \oldst refs -> (unwrapWS a wst refs, oldst)++runWS :: WState -> WS a -> (a, WState)+runWS st a = fix $ unwrapWS a st . view wsReferences . snd++liftF :: (References -> a) -> WS a+liftF x = WS $ StateT \wst refs -> (x refs, wst)
lib-internal/Text/Pandoc/CrossRef/References/Refs.hs view
@@ -21,7 +21,6 @@ module Text.Pandoc.CrossRef.References.Refs (replaceRefs) where import Control.Arrow as A-import Control.Monad.Reader import Data.Function import Numeric.Natural import Data.List@@ -37,23 +36,20 @@ import Data.List.NonEmpty (NonEmpty) import Debug.Trace-import Lens.Micro.Mtl+import Lens.Micro import Text.Pandoc.CrossRef.References.Types-import Text.Pandoc.CrossRef.References.Monad import Text.Pandoc.CrossRef.Util.Options import Text.Pandoc.CrossRef.Util.Template import Text.Pandoc.CrossRef.Util.Util -replaceRefs :: [Inline] -> WS [Inline]-replaceRefs (Cite cits _:xs) = do- opts <- ask :: WS Options- toList . (<> fromList xs) . intercalate' (text ", ") . map fromList <$> mapM (replaceRefs' opts) (NE.groupBy eqPrefix cits)+replaceRefs :: [Citation] -> Options -> References -> Inlines+replaceRefs cits opts = intercalate' (text ", ") . map fromList <$> mapM replaceRefs' (NE.groupBy eqPrefix cits) where eqPrefix = (==) `on` getLabelPrefix . citationId- replaceRefs' :: Options -> NonEmpty Citation -> WS [Inline]- replaceRefs' opts cits'+ replaceRefs' :: NonEmpty Citation -> References -> [Inline]+ replaceRefs' cits' | Just prefix <- getLabelPrefix . citationId $ NE.head cits'- = replaceRefs'' opts prefix cits'+ = replaceRefs'' prefix cits' | otherwise = return [Cite (NE.toList cits') il'] where il' = toList $@@ -63,12 +59,11 @@ citationToInlines c = fromList (citationPrefix c) <> text ("@" <> citationId c) <> fromList (citationSuffix c)- replaceRefs'' :: Options -> Prefix -> NonEmpty Citation -> WS [Inline]- replaceRefs'' opts = ($ opts) . flip $+ replaceRefs'' :: Prefix -> NonEmpty Citation -> References -> [Inline]+ replaceRefs'' = ($ opts) . flip $ if isLatexFormat opts then replaceRefsLatex else replaceRefsOther-replaceRefs x = return x -- accessors to options prefMap :: Prefix -> (Options -> Bool -> Int -> [Inline], Options -> Template)@@ -89,7 +84,7 @@ where (refprefixf, reftempl) = prefMap prefix refprefix = refprefixf opts capitalize num -replaceRefsLatex :: Prefix -> Options -> NonEmpty Citation -> WS [Inline]+replaceRefsLatex :: Prefix -> Options -> NonEmpty Citation -> References -> [Inline] replaceRefsLatex prefix opts cits | cref opts = replaceRefsLatex' prefix opts cits@@ -97,7 +92,7 @@ = toList . intercalate' (text ", ") . map fromList <$> mapM (replaceRefsLatex' prefix opts) (NE.groupBy citationGroupPred cits) -replaceRefsLatex' :: Prefix -> Options -> NonEmpty Citation -> WS [Inline]+replaceRefsLatex' :: Prefix -> Options -> NonEmpty Citation -> References -> [Inline] replaceRefsLatex' prefix opts cits = return $ p [texcit] where@@ -135,17 +130,17 @@ where p = uncapitalizeFirst $ flip T.snoc ':' . T.takeWhile (/=':') $ lab -replaceRefsOther :: Prefix -> Options -> NonEmpty Citation -> WS [Inline]+replaceRefsOther :: Prefix -> Options -> NonEmpty Citation -> References -> [Inline] replaceRefsOther prefix opts cits = toList . intercalate' (text ", ") . map fromList <$> traverse (replaceRefsOther' prefix opts) (NE.groupBy citationGroupPred cits) citationGroupPred :: Citation -> Citation -> Bool citationGroupPred = (==) `on` liftM2 (,) citationPrefix citationMode -replaceRefsOther' :: Prefix -> Options -> NonEmpty Citation -> WS [Inline]-replaceRefsOther' prefix opts cits = do- indices <- mapM (getRefIndex prefix opts) $ NE.toList cits+replaceRefsOther' :: Prefix -> Options -> NonEmpty Citation -> References -> [Inline]+replaceRefsOther' prefix opts cits refs = let+ indices = getRefIndex prefix refs <$> NE.toList cits cap = isFirstUpper . citationId . NE.head $ cits writePrefix | all ((==SuppressAuthor) . citationMode) cits = id@@ -156,7 +151,7 @@ cmap f [Link attr t w] | nameInLink opts = [Link attr (f t) w] cmap f x = f x- return $ writePrefix (makeIndices opts indices)+ in writePrefix (makeIndices opts indices) data RefData = RefData { rdGlob :: Maybe Natural , rdLabel :: T.Text@@ -167,15 +162,14 @@ , rdPfx :: Prefix } deriving (Eq) -getRefIndex :: Prefix -> Options -> Citation -> WS RefData-getRefIndex prefix _opts Citation{citationId=cid,citationSuffix=suf}- = do- ref <- M.lookup lab <$> use prop- let sub = refSubfigure <$> ref+getRefIndex :: Prefix -> References -> Citation -> RefData+getRefIndex prefix refs Citation{citationId=cid,citationSuffix=suf}+ = let ref = M.lookup (IdxRef prefix lab) $ refs ^. prop+ sub = refSubfigure <$> ref idx = refIndex <$> ref tit = refTitle <$> ref glob = refGlobal <$> ref- return RefData+ in RefData { rdGlob = glob , rdLabel = lab , rdIdx = idx
lib-internal/Text/Pandoc/CrossRef/References/Types.hs view
@@ -40,7 +40,14 @@ , refLabel :: Maybe Text } deriving (Show, Eq) -type RefMap = M.Map Text RefRec+type RefMap = M.Map RefIndex RefRec++data RefIndex = IdxSynth Natural | IdxRef Prefix Text+ deriving (Eq, Ord, Show)++displayIdx :: RefIndex -> String+displayIdx (IdxSynth ctr) = "#" <> show ctr+displayIdx (IdxRef _ txt) = T.unpack txt data Prefix = PfxImg
lib-internal/Text/Pandoc/CrossRef/Util/CodeBlockCaptions.hs view
@@ -23,28 +23,18 @@ mkCodeBlockCaptions ) where -import Control.Monad.Reader (ask) import Data.List (stripPrefix)-import Data.Maybe (fromMaybe) import qualified Data.Text as T import Text.Pandoc.CrossRef.References.Types-import Text.Pandoc.CrossRef.References.Monad import Text.Pandoc.CrossRef.Util.Options import Text.Pandoc.CrossRef.Util.Util import Text.Pandoc.Definition -mkCodeBlockCaptions :: [Block] -> WS [Block]-mkCodeBlockCaptions = \case- x@(cb@CodeBlock{}:p@Para{}:xs) -> go x p cb xs- x@(p@Para{}:cb@CodeBlock{}:xs) -> go x p cb xs- x -> pure x- where- go :: [Block] -> Block -> Block -> [Block] -> WS [Block]- go x p cb xs = do- opts <- ask- return $ fromMaybe x $ orderAgnostic opts $ p:cb:xs+mkCodeBlockCaptions :: Options -> [Block] -> Maybe [Block]+mkCodeBlockCaptions = orderAgnostic orderAgnostic :: Options -> [Block] -> Maybe [Block]+orderAgnostic opts (a@CodeBlock{}:b@Para{}:xs) = orderAgnostic opts (b:a:xs) orderAgnostic opts (Para ils:CodeBlock (label,classes,attrs) code:xs) | codeBlockCaptions opts , Just caption <- getCodeBlockCaption ils
+ lib-internal/Text/Pandoc/CrossRef/Util/Generic.hs view
@@ -0,0 +1,131 @@+{-+pandoc-crossref is a pandoc filter for numbering figures,+equations, tables and cross-references to them.+Copyright (C) 2015 Nikolay Yakimov <root@livid.pp.ru>++This program is free software; you can redistribute it and/or modify+it under the terms of the GNU General Public License as published by+the Free Software Foundation; either version 2 of the License, or+(at your option) any later version.++This program is distributed in the hope that it will be useful,+but WITHOUT ANY WARRANTY; without even the implied warranty of+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the+GNU General Public License for more details.++You should have received a copy of the GNU General Public License along+with this program; if not, write to the Free Software Foundation, Inc.,+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.+-}++{-# LANGUAGE MonoLocalBinds, TypeAbstractions #-}++module Text.Pandoc.CrossRef.Util.Generic+ ( module Data.Generics+ , runReplace+ , replaceRecurse+ , replaceNoRecurse+ , ReplacedResult+ , noReplaceRecurse+ , mkRR+ , extRR+ , replaceList+ , fixRefs+ , fixRefs'+ , replaceRefsWalk+ ) where++import Data.Generics+import Text.Pandoc.Builder hiding ((<>))+import Text.Pandoc.CrossRef.References.Monad+import Text.Pandoc.CrossRef.References.Types+import Text.Pandoc.CrossRef.References.Refs+import Text.Pandoc.CrossRef.Util.Options+import Lens.Micro.Mtl+import Lens.Micro+import qualified Text.Pandoc.Builder as B++data ReplacedResult a where+ Replaced :: Recurse -> a -> ReplacedResult a+ ReplacedList :: FixRefs a b => ([a] -> WS [a]) -> b -> b -> ReplacedResult [a]+ NotReplaced :: ReplacedResult a+data Recurse = Recurse | NoRecurse+newtype RR m a = RR {unRR :: a -> m (ReplacedResult a)}++class Monoid b => FixRefs a b where+ lens' :: Lens' b [a]++instance FixRefs Inline Inlines where+ lens' = lens B.toList (const B.fromList)++instance FixRefs Block Blocks where+ lens' = lens B.toList (const B.fromList)++instance FixRefs a [a] where+ lens' = id++fixRefs :: (Data a, FixRefs a b, Monad m) => m (Maybe b) -> [a] -> m (ReplacedResult [a])+fixRefs x rest =+ -- NB: must be very-very careful to not inspect the result beyond Maybe,+ -- otherwise fix in deferred part will loop+ x >>= \case+ Just res' -> replaceList' pure res' rest+ Nothing -> noReplaceRecurse++fixRefs' :: Inline -> [Inline] -> WS (ReplacedResult [Inline])+fixRefs' = fixRefs . replaceRefsInline++replaceRefsInline :: Inline -> WS (Maybe Inlines)+replaceRefsInline (Cite cits _) = Just <$> do+ opts <- use wsOptions+ -- recurse into prefix/suffix+ cits' <- doReplaceRefs cits+ liftF $ replaceRefs cits' opts+replaceRefsInline _ = pure Nothing++replaceRefsWalk :: Data a => Options -> References -> a -> a+replaceRefsWalk o r x = fst $ unwrapWS (doReplaceRefs x) (WState o r) r++doReplaceRefs :: Data a => a -> WS a+doReplaceRefs = runReplace $ mkRR \case+ (x:xs) -> fixRefs' x xs+ [] -> noReplaceRecurse++runReplace+ :: Data a+ => (forall d. Data d => (d -> WS (ReplacedResult d)))+ -> a -> WS a+runReplace f x = f x >>= \case+ Replaced Recurse x' -> gmapM (runReplace f) x'+ Replaced NoRecurse x' -> pure x'+ NotReplaced -> gmapM (runReplace f) x+ ReplacedList @a hdT hd tl -> do+ hd' <- hdT `lens'` hd+ tl' <- runReplace @[a] f `lens'` tl+ pure $ view lens' $ hd' <> tl'++mkRR :: (Monad m, Typeable a, Typeable b)+ => (b -> m (ReplacedResult b))+ -> (a -> m (ReplacedResult a))+mkRR = extRR (const noReplaceRecurse)++extRR :: ( Monad m, Typeable a, Typeable b)+ => (a -> m (ReplacedResult a))+ -> (b -> m (ReplacedResult b))+ -> (a -> m (ReplacedResult a))+extRR def' ext = unRR (RR def' `ext0` RR ext)++replaceRecurse :: Monad m => a -> m (ReplacedResult a)+replaceRecurse = pure . Replaced Recurse++replaceNoRecurse :: Data a => a -> WS (ReplacedResult a)+replaceNoRecurse = fmap (Replaced NoRecurse) . doReplaceRefs++replaceList :: (FixRefs a b, Monad m, Monoid b, Data a) => b -> [a] -> m (ReplacedResult [a])+replaceList = replaceList' doReplaceRefs++replaceList' :: (FixRefs a b, Monad m, Monoid b, Data a) => ([a] -> WS [a]) -> b -> [a] -> m (ReplacedResult [a])+replaceList' hdT hd tl = pure $ ReplacedList hdT hd (mempty & lens' .~ tl)++noReplaceRecurse :: Monad m => m (ReplacedResult a)+noReplaceRecurse = pure NotReplaced
lib-internal/Text/Pandoc/CrossRef/Util/ModifyMeta.hs view
@@ -24,7 +24,7 @@ ) where import Control.Monad.Writer-import Control.Monad (when, unless, (>=>))+import Control.Monad (when, unless) import Data.Function ((&)) import qualified Data.Text as T import Text.Pandoc@@ -32,26 +32,21 @@ import Text.Pandoc.CrossRef.Util.Meta import Text.Pandoc.CrossRef.Util.Options import Text.Pandoc.CrossRef.References.List-import Text.Pandoc.CrossRef.References.Monad+import Text.Pandoc.CrossRef.References.Types -modifyMeta :: Options -> Meta -> WS Meta-modifyMeta opts meta+modifyMeta :: Options -> Meta -> References -> Meta+modifyMeta opts meta refs = meta & opt isLatexFormat (setMeta "header-includes" (headerInc $ lookupMeta "header-includes" meta))- & optM listOfMetadata- ( setMetaM "list-of-figures" (fromList <$> listOfFigures)- >=> setMetaM "list-of-tables" (fromList <$> listOfTables)- >=> setMetaM "list-of-listings" (fromList <$> listOfListings)+ & opt listOfMetadata+ ( setMeta "list-of-figures" (fromList $ listOfFigures opts refs)+ . setMeta "list-of-tables" (fromList $ listOfTables opts refs)+ . setMeta "list-of-listings" (fromList $ listOfListings opts refs) ) where- setMetaM :: ToMetaValue v => T.Text -> WS v -> Meta -> WS Meta- setMetaM k m meta' = m >>= \v -> pure $ setMeta k v meta' opt q f | q opts = f | otherwise = id- optM q f- | q opts = f- | otherwise = pure headerInc :: Maybe MetaValue -> MetaValue headerInc Nothing = incList headerInc (Just (MetaList x)) = MetaList $ x <> [incList]@@ -73,9 +68,9 @@ where atEndPreamble = censor (\c -> "\\AtEndPreamble{%":c <> ["}"]) subfig = [- usepackage [] "subfig"+ usepackage [] "subcaption" , usepackage [] "caption"- , "\\captionsetup[subfloat]{margin=0.5em}"+ , "\\captionsetup[subfigure]{margin=0.5em}" ] floatnames = [ "\\AtBeginDocument{%"
lib-internal/Text/Pandoc/CrossRef/Util/Options.hs view
@@ -76,6 +76,7 @@ , tableEqns :: Bool , autoEqnLabels :: Bool , subfigGrid :: Bool+ , subfigColumns :: Bool , linkReferences :: Bool , nameInLink :: Bool , setLabelAttribute :: Bool@@ -84,7 +85,7 @@ } isLatexFormat :: Options -> Bool-isLatexFormat = ((||) <$> (isFormat "latex") <*> (isFormat "beamer")) . outFormat+isLatexFormat = ((||) <$> isFormat "latex" <*> isFormat "beamer") . outFormat isDocxFormat :: Options -> Bool isDocxFormat = isFormat "docx" . outFormat
lib-internal/Text/Pandoc/CrossRef/Util/Util.hs view
@@ -65,45 +65,6 @@ . S.filter (not . T.null) . fmap (uncurry (fromMaybe . T.pack . show)) -data ReplacedResult a = Replaced Bool a | NotReplaced Bool-type GenRR m = forall a. Data a => (a -> m (ReplacedResult a))-newtype RR m a = RR {unRR :: a -> m (ReplacedResult a)}--runReplace :: (Monad m) => GenRR m -> GenericM m-runReplace f x = do- res <- f x- case res of- Replaced True x' -> gmapM (runReplace f) x'- Replaced False x' -> return x'- NotReplaced True -> gmapM (runReplace f) x- NotReplaced False -> return x--mkRR :: (Monad m, Typeable a, Typeable b)- => (b -> m (ReplacedResult b))- -> (a -> m (ReplacedResult a))-mkRR = extRR (const noReplaceRecurse)--extRR :: ( Monad m, Typeable a, Typeable b)- => (a -> m (ReplacedResult a))- -> (b -> m (ReplacedResult b))- -> (a -> m (ReplacedResult a))-extRR def' ext = unRR (RR def' `ext0` RR ext)--replaceRecurse :: Monad m => a -> m (ReplacedResult a)-replaceRecurse = return . Replaced True--replaceNoRecurse :: Monad m => a -> m (ReplacedResult a)-replaceNoRecurse = return . Replaced False--noReplace :: Monad m => Bool -> m (ReplacedResult a)-noReplace recurse = return $ NotReplaced recurse--noReplaceRecurse :: Monad m => m (ReplacedResult a)-noReplaceRecurse = noReplace True--noReplaceNoRecurse :: Monad m => m (ReplacedResult a)-noReplaceNoRecurse = noReplace False- mkLaTeXLabel :: T.Text -> T.Text mkLaTeXLabel l | T.null l = ""
lib/Text/Pandoc/CrossRef.hs view
@@ -79,13 +79,12 @@ , CrossRefEnv(..) ) where -import qualified Control.Monad.Reader as R-import Control.Monad.State+import Lens.Micro.Mtl+import Control.Monad.Reader import Text.Pandoc import Text.Pandoc.CrossRef.References import Text.Pandoc.CrossRef.References.Monad-import Text.Pandoc.CrossRef.Util.CodeBlockCaptions import Text.Pandoc.CrossRef.Util.ModifyMeta import Text.Pandoc.CrossRef.Util.Settings import Text.Pandoc.CrossRef.Util.Settings.Gen as SG@@ -96,40 +95,29 @@ Works in 'CrossRefM' monad. -} crossRefBlocks :: [Block] -> CrossRefM [Block]-crossRefBlocks blocks = CrossRefM $ R.withReaderT creOptions $ runWS doWalk- where- doWalk =- bottomUpM mkCodeBlockCaptions blocks- >>= replaceAll- >>= bottomUpM replaceRefs- >>= bottomUpM listOf+crossRefBlocks = CrossRefM . lift . replaceAll {- | Modifies metadata, adding header-includes instructions to setup custom and builtin environments, plus list-of-x metadata fields if 'Text.Pandoc.CrossRef.Util.Settings.Gen.listOfMetadata' is enabled. -Note for @listOfMetadata@ to work properly, this MUST be invoked AFTER-'crossRefBlocks'.- Works in 'CrossRefM' monad. -} crossRefMeta :: CrossRefM Meta-crossRefMeta = do- opts <- R.asks creOptions- dtv <- R.asks creSettings- CrossRefM $ R.withReaderT creOptions $ runWS $ modifyMeta opts dtv+crossRefMeta = CrossRefM do+ settings <- ask+ lift do+ opts <- use wsOptions+ liftF $ modifyMeta opts settings {- | Combines 'crossRefMeta' and 'crossRefBlocks' Works in 'CrossRefM' monad. -} defaultCrossRefAction :: Pandoc -> CrossRefM Pandoc-defaultCrossRefAction (Pandoc _ bs) = do- bs' <- crossRefBlocks bs- meta' <- crossRefMeta- return $ Pandoc meta' bs'+defaultCrossRefAction (Pandoc _ bs) = Pandoc <$> crossRefMeta <*> crossRefBlocks bs {- | Run an action in 'CrossRefM' monad with argument, and return pure result. -This is primary function to work with 'CrossRefM' -}+This is the primary function to work with 'CrossRefM' -} runCrossRef :: forall a b. Meta -> Maybe Format -> (a -> CrossRefM b) -> a -> b runCrossRef meta fmt action arg = runCrossRefInternal env $ action arg where@@ -137,6 +125,7 @@ env = CrossRefEnv { creSettings = settings , creOptions = getOptions settings fmt+ , creReferences = def } {- | Run an action in 'CrossRefM' monad with argument, and return 'IO' result.@@ -150,10 +139,10 @@ env = CrossRefEnv { creSettings = settings , creOptions = getOptions settings fmt+ , creReferences = def } pure $ runCrossRefInternal env $ action arg runCrossRefInternal :: CrossRefEnv -> CrossRefM b -> b-runCrossRefInternal env (CrossRefM action) =- let (res, st) = flip runState def $ flip R.runReaderT env action- in st `seq` res+runCrossRefInternal CrossRefEnv { creOptions, creReferences, creSettings } (CrossRefM action) =+ fst $ runWS (WState creOptions creReferences) (runReaderT action creSettings)
lib/Text/Pandoc/CrossRef/Internal.hs view
@@ -33,10 +33,10 @@ module Text.Pandoc.CrossRef.Internal (CrossRefEnv(..), CrossRefM(..)) where -import qualified Control.Monad.Reader as R-import Control.Monad.State+import Control.Monad.Reader import Text.Pandoc +import Text.Pandoc.CrossRef.References.Monad import Text.Pandoc.CrossRef.References import Text.Pandoc.CrossRef.Util.Options @@ -44,8 +44,12 @@ data CrossRefEnv = CrossRefEnv { creSettings :: Meta -- ^Metadata settings , creOptions :: Options -- ^Internal pandoc-crossref options+ , creReferences :: References -- ^ Internal state tracking references } --- | Reader + State monad for pandoc-crossref.-newtype CrossRefM a = CrossRefM (R.ReaderT CrossRefEnv (State References) a)- deriving (Functor, Applicative, Monad, R.MonadReader CrossRefEnv, MonadState References)+-- | Bit of a weird self-recursive State monad (not MonadFix). The inner reader+-- (function) monad takes the final state (or part of it anyway) as its input.+-- This is all carefully choreographed to lazily converge to a fixpoint, but it+-- is also feasible to evaluate this in two passes instead.+newtype CrossRefM a = CrossRefM (ReaderT Meta WS a)+ deriving (Functor, Applicative, Monad, MonadReader Meta)
pandoc-crossref.cabal view
@@ -1,11 +1,11 @@ cabal-version: 2.0 --- This file has been generated from package.yaml by hpack version 0.37.0.+-- This file has been generated from package.yaml by hpack version 0.38.1. -- -- see: https://github.com/sol/hpack name: pandoc-crossref-version: 0.3.20+version: 0.3.21 synopsis: Pandoc filter for cross-references description: pandoc-crossref is a pandoc filter for numbering figures, equations, tables and cross-references to them. category: Text@@ -102,6 +102,12 @@ test/m2m/numberOverride/expect.md test/m2m/numberOverride/expect.tex test/m2m/numberOverride/input.md+ test/m2m/refsInListOf/expect.md+ test/m2m/refsInListOf/expect.tex+ test/m2m/refsInListOf/input.md+ test/m2m/refsInObjects/expect.md+ test/m2m/refsInObjects/expect.tex+ test/m2m/refsInObjects/input.md test/m2m/secLabels/expect.md test/m2m/secLabels/expect.tex test/m2m/secLabels/input.md@@ -114,9 +120,15 @@ test/m2m/setLabelAttribute/expect.md test/m2m/setLabelAttribute/expect.tex test/m2m/setLabelAttribute/input.md+ test/m2m/standalone-listOfMetadata/expect.md+ test/m2m/standalone-listOfMetadata/expect.tex+ test/m2m/standalone-listOfMetadata/input.md test/m2m/subfigures-ccsDelim/expect.md test/m2m/subfigures-ccsDelim/expect.tex test/m2m/subfigures-ccsDelim/input.md+ test/m2m/subfigures-columns/expect.md+ test/m2m/subfigures-columns/expect.tex+ test/m2m/subfigures-columns/input.md test/m2m/subfigures-grid/expect.md test/m2m/subfigures-grid/expect.tex test/m2m/subfigures-grid/input.md@@ -157,8 +169,10 @@ ghc-options: -Wall build-depends: base >=4.16 && <5+ , microlens >=0.4.12.0 && <0.5.0.0+ , microlens-mtl >=0.2.0.1 && <0.3.0.0 , mtl >=1.1 && <2.4- , pandoc >=3.7.0.2 && <3.8+ , pandoc ==3.8.* , pandoc-crossref-internal , pandoc-types ==1.23.* , text >=1.2.2 && <2.2@@ -181,6 +195,7 @@ Text.Pandoc.CrossRef.References.Types Text.Pandoc.CrossRef.Util.CodeBlockCaptions Text.Pandoc.CrossRef.Util.CustomLabels+ Text.Pandoc.CrossRef.Util.Generic Text.Pandoc.CrossRef.Util.Meta Text.Pandoc.CrossRef.Util.ModifyMeta Text.Pandoc.CrossRef.Util.Options@@ -202,8 +217,8 @@ BlockArguments build-depends: base >=4.16 && <5- , containers >=0.1 && <0.7- , data-default >=0.4 && <0.8+ , containers >=0.1 && <0.9+ , data-default >=0.4 && <0.9 , directory >=1 && <1.4 , filepath >=1.1 && <1.6 , microlens >=0.4.12.0 && <0.5.0.0@@ -211,7 +226,7 @@ , microlens-mtl >=0.2.0.1 && <0.3.0.0 , microlens-th >=0.4.3.10 && <0.5.0.0 , mtl >=1.1 && <2.4- , pandoc >=3.7.0.2 && <3.8+ , pandoc ==3.8.* , pandoc-types ==1.23.* , syb >=0.4 && <0.8 , template-haskell >=2.7.0.0 && <3.0.0.0@@ -239,9 +254,9 @@ base >=4.16 && <5 , deepseq >=1.4 && <1.6 , gitrev >=1.3.1 && <1.4- , open-browser ==0.2.*- , optparse-applicative >=0.13 && <0.19- , pandoc >=3.7.0.2 && <3.8+ , open-browser >=0.2 && <0.4+ , optparse-applicative >=0.13 && <0.20+ , pandoc ==3.8.* , pandoc-crossref , pandoc-types ==1.23.* , template-haskell >=2.7.0.0 && <3.0.0.0@@ -271,7 +286,7 @@ , directory >=1 && <1.4 , filepath >=1.1 && <1.6 , hspec >=2.4.4 && <3- , pandoc >=3.7.0.2 && <3.8+ , pandoc ==3.8.* , pandoc-crossref , pandoc-types ==1.23.* , text >=1.2.2 && <2.2@@ -301,12 +316,13 @@ ghc-options: -Wall -fno-warn-unused-do-bind -threaded build-depends: base >=4.16 && <5- , containers >=0.1 && <0.7- , data-default >=0.4 && <0.8+ , containers >=0.1 && <0.9+ , data-default >=0.4 && <0.9 , hspec >=2.4.4 && <3 , microlens >=0.4.12.0 && <0.5.0.0+ , microlens-mtl >=0.2.0.1 && <0.3.0.0 , mtl >=1.1 && <2.4- , pandoc >=3.7.0.2 && <3.8+ , pandoc ==3.8.* , pandoc-crossref , pandoc-crossref-internal , pandoc-types ==1.23.*@@ -335,7 +351,7 @@ build-depends: base >=4.16 && <5 , criterion >=1.5.9.0 && <1.7- , pandoc >=3.7.0.2 && <3.8+ , pandoc ==3.8.* , pandoc-crossref , pandoc-types ==1.23.* , text >=1.2.2 && <2.2
src/ManData.hs view
@@ -62,7 +62,7 @@ $ P.compileDefaultTemplate "html5" embedManual $ P.writeHtml5String P.def{ P.writerTemplate = Just tt- , P.writerHighlightStyle = Just pygments+ , P.writerHighlightMethod = P.Skylighting pygments , P.writerTOCDepth = 6 , P.writerTableOfContents = True }
test/demo-chapters.inc view
@@ -462,6 +462,82 @@ [ Image ( "" , [] , [] ) [ Str "b" ] ( "img1.jpg" , "" ) ] ] ]+ , Figure+ ( "fig:subfigures-side-by-side" , [ "subfigures" ] , [] )+ (Caption+ Nothing+ [ Para+ [ Str "Figure"+ , Space+ , Str "#"+ , Space+ , Str "1.5:"+ , Space+ , Str "Subfigures"+ , Space+ , Str "side"+ , Space+ , Str "by"+ , Space+ , Str "side."+ , Space+ , Str "a"+ , Space+ , Str "\8212"+ , Space+ , Str "Subfigure"+ , Space+ , Str "a,"+ , Space+ , Str "b"+ , Space+ , Str "\8212"+ , Space+ , Str "Subfigure"+ , Space+ , Str "b,"+ , Space+ , Str "c"+ , Space+ , Str "\8212"+ , Space+ , Str "Subfigure"+ , Space+ , Str "c"+ ]+ ])+ [ Div+ ( "" , [ "columns" ] , [] )+ [ Div+ ( "" , [ "column" ] , [ ( "width" , "49.5%" ) ] )+ [ Figure+ ( "" , [] , [] )+ (Caption Nothing [ Plain [ Str "a" ] ])+ [ Plain+ [ Image+ ( "" , [] , [] ) [ Str "a" ] ( "img1.jpg" , "" )+ ]+ ]+ ]+ , Div+ ( "" , [ "column" ] , [ ( "width" , "49.5%" ) ] )+ [ Figure+ ( "" , [] , [] )+ (Caption Nothing [ Plain [ Str "b" ] ])+ [ Plain+ [ Image+ ( "" , [] , [] ) [ Str "b" ] ( "img2.jpg" , "" )+ ]+ ]+ ]+ ]+ , Figure+ ( "" , [] , [] )+ (Caption Nothing [ Plain [ Str "c" ] ])+ [ Plain+ [ Image ( "" , [] , [] ) [ Str "c" ] ( "img3.jpg" , "" ) ]+ ]+ ] , Header 1 ( "sec:sec2" , [] , [] )@@ -1104,6 +1180,48 @@ , Str "Subfigure" , Space , Str "b"+ , LineBreak+ ]+ , Plain+ [ Str "1.5."+ , Space+ , Str "Subfigures"+ , Space+ , Str "side"+ , Space+ , Str "by"+ , Space+ , Str "side"+ , LineBreak+ ]+ , Plain+ [ Str "1.5"+ , Space+ , Str "(a)."+ , Space+ , Str "Subfigure"+ , Space+ , Str "a"+ , LineBreak+ ]+ , Plain+ [ Str "1.5"+ , Space+ , Str "(b)."+ , Space+ , Str "Subfigure"+ , Space+ , Str "b"+ , LineBreak+ ]+ , Plain+ [ Str "1.5"+ , Space+ , Str "(c)."+ , Space+ , Str "Subfigure"+ , Space+ , Str "c" , LineBreak ] ]
test/demo.inc view
@@ -462,6 +462,82 @@ [ Image ( "" , [] , [] ) [ Str "b" ] ( "img1.jpg" , "" ) ] ] ]+ , Figure+ ( "fig:subfigures-side-by-side" , [ "subfigures" ] , [] )+ (Caption+ Nothing+ [ Para+ [ Str "Figure"+ , Space+ , Str "#"+ , Space+ , Str "6:"+ , Space+ , Str "Subfigures"+ , Space+ , Str "side"+ , Space+ , Str "by"+ , Space+ , Str "side."+ , Space+ , Str "a"+ , Space+ , Str "\8212"+ , Space+ , Str "Subfigure"+ , Space+ , Str "a,"+ , Space+ , Str "b"+ , Space+ , Str "\8212"+ , Space+ , Str "Subfigure"+ , Space+ , Str "b,"+ , Space+ , Str "c"+ , Space+ , Str "\8212"+ , Space+ , Str "Subfigure"+ , Space+ , Str "c"+ ]+ ])+ [ Div+ ( "" , [ "columns" ] , [] )+ [ Div+ ( "" , [ "column" ] , [ ( "width" , "49.5%" ) ] )+ [ Figure+ ( "" , [] , [] )+ (Caption Nothing [ Plain [ Str "a" ] ])+ [ Plain+ [ Image+ ( "" , [] , [] ) [ Str "a" ] ( "img1.jpg" , "" )+ ]+ ]+ ]+ , Div+ ( "" , [ "column" ] , [ ( "width" , "49.5%" ) ] )+ [ Figure+ ( "" , [] , [] )+ (Caption Nothing [ Plain [ Str "b" ] ])+ [ Plain+ [ Image+ ( "" , [] , [] ) [ Str "b" ] ( "img2.jpg" , "" )+ ]+ ]+ ]+ ]+ , Figure+ ( "" , [] , [] )+ (Caption Nothing [ Plain [ Str "c" ] ])+ [ Plain+ [ Image ( "" , [] , [] ) [ Str "c" ] ( "img3.jpg" , "" ) ]+ ]+ ] , Header 1 ( "sec:sec2" , [] , [] )@@ -1103,6 +1179,48 @@ , Str "Subfigure" , Space , Str "b"+ , LineBreak+ ]+ , Plain+ [ Str "6."+ , Space+ , Str "Subfigures"+ , Space+ , Str "side"+ , Space+ , Str "by"+ , Space+ , Str "side"+ , LineBreak+ ]+ , Plain+ [ Str "6"+ , Space+ , Str "(a)."+ , Space+ , Str "Subfigure"+ , Space+ , Str "a"+ , LineBreak+ ]+ , Plain+ [ Str "6"+ , Space+ , Str "(b)."+ , Space+ , Str "Subfigure"+ , Space+ , Str "b"+ , LineBreak+ ]+ , Plain+ [ Str "6"+ , Space+ , Str "(c)."+ , Space+ , Str "Subfigure"+ , Space+ , Str "c" , LineBreak ] ]
test/m2m/equations-tables-auto/expect.md view
@@ -1,46 +1,38 @@ This is a test file with some referenced equations, line -<div>-+::: {} +:-------------------------------------------------------------:+--------:+ | $$ this $$ | $$(1)$$ | +---------------------------------------------------------------+---------+--</div>+::: Some equations might be inside of text, -<div>-+::: {} +:-------------------------------------------------------------:+--------:+ | $$ for example $$ | $$(2)$$ | +---------------------------------------------------------------+---------+--</div>+::: this one. Some equations might be on start of paragraphs: -<div>-+::: {} +:-------------------------------------------------------------:+--------:+ | $$ start $$ | $$(3)$$ | +---------------------------------------------------------------+---------+--</div>+::: of paragraph. Other might be on separate paragraphs of their own: -<div>-+::: {} +:-------------------------------------------------------------:+--------:+ | $$ separate $$ | $$(4)$$ | +---------------------------------------------------------------+---------+--</div>+::: Some of those can be labelled:
test/m2m/listOfHidden/expect.tex view
@@ -119,10 +119,10 @@ \begin{pandoccrossrefsubfigures} -\subfloat[hidden!-subfigure1]{\pandocbounded{\includegraphics[keepaspectratio,alt={hidden! subfigure1}]{figs/fig_s2.jpg}}\label{fig:fig_sss1}}-\subfloat[hidden!-subfigure2]{\pandocbounded{\includegraphics[keepaspectratio,alt={hidden! subfigure2}]{figs/fig_s2.jpg}}\label{fig:fig_sss2}}+\begin{subfigure}{0.495\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={hidden! subfigure1}]{figs/fig_s2.jpg}}\caption{hidden!+subfigure1\label{fig:fig_sss1}}\end{subfigure}%+\begin{subfigure}{0.495\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={hidden! subfigure2}]{figs/fig_s2.jpg}}\caption{hidden!+subfigure2\label{fig:fig_sss2}}\end{subfigure}% \caption[]{hidden! subfigures}\label{fig:subfigs}
+ test/m2m/refsInListOf/expect.md view
@@ -0,0 +1,32 @@+# Chapter 1++{#fig:fig1}++Some filler text, with in-text citations of both fig. 1 and fig. 2, and+also (functionally) citing tbl. 1++{#fig:fig2}++There's actually a new problem where it breaks *other* valid references+if you try to cite them in main text next to one of the ones cited in a+figure caption, e.g. (fig. 1, tbl. 1) or (fig. 2, tbl. 1), although if+you cite the thing alone it'll work just fine (tbl. 1)++::: {#tbl:tbl1}+ col1 col2+ ------ ------+ row1 row1+ row2 ro2++ : Table 1: Table 1+:::++# List of Figures++::: {.list .list-of-fig}+1\. first figure caption with a citation to fig. 2 in it\++2\. second figure caption with a citation to fig. 1 in it\+:::
+ test/m2m/refsInListOf/expect.tex view
@@ -0,0 +1,42 @@+\section{Chapter 1}\label{chapter-1}++\begin{figure}+\centering+\pandocbounded{\includegraphics[keepaspectratio,alt={first figure caption with a citation to fig.~ in it}]{fig1.jpg}}+\caption{first figure caption with a citation to fig.~\ref{fig:fig2} in+it}\label{fig:fig1}+\end{figure}++Some filler text, with in-text citations of both fig.~\ref{fig:fig1} and+fig.~\ref{fig:fig2}, and also (functionally) citing tbl.~\ref{tbl:tbl1}++\begin{figure}+\centering+\pandocbounded{\includegraphics[keepaspectratio,alt={second figure caption with a citation to fig.~ in it}]{fig2.jpg}}+\caption{second figure caption with a citation to fig.~\ref{fig:fig1} in+it}\label{fig:fig2}+\end{figure}++There's actually a new problem where it breaks \emph{other} valid+references if you try to cite them in main text next to one of the ones+cited in a figure caption, e.g.~(fig.~\ref{fig:fig1}) or+(fig.~\ref{fig:fig2}), although if you cite the thing alone it'll work+just fine (tbl.~\ref{tbl:tbl1})++\begin{longtable}[]{@{}ll@{}}+\caption{\label{tbl:tbl1}Table 1}\tabularnewline+\toprule\noalign{}+col1 & col2 \\+\midrule\noalign{}+\endfirsthead+\toprule\noalign{}+col1 & col2 \\+\midrule\noalign{}+\endhead+\bottomrule\noalign{}+\endlastfoot+row1 & row1 \\+row2 & ro2 \\+\end{longtable}++\listoffigures
+ test/m2m/refsInListOf/input.md view
@@ -0,0 +1,20 @@+# Chapter 1++![first figure caption with a citation to [@fig:fig2] in it](fig1.jpg){#fig:fig1}++Some filler text, with in-text citations of both [@fig:fig1] and [@fig:fig2], and also (functionally) citing [@tbl:tbl1]++![second figure caption with a citation to [@fig:fig1] in it](fig2.jpg){#fig:fig2}++There's actually a new problem where it breaks *other* valid references if you try to cite them in main text next to one of the ones cited in a figure caption, e.g. ([@fig:fig1, @tbl:tbl1]) or ([@fig:fig2, @tbl:tbl1]), although if you cite the thing alone it'll work just fine ([@tbl:tbl1])+++| col1 | col2 |+|------|------|+| row1 | row1 |+| row2 | ro2 |++: Table 1 {#tbl:tbl1}+++\listoffigures
+ test/m2m/refsInObjects/expect.md view
@@ -0,0 +1,29 @@+# sec. 1 {#sec:hdr}++{#fig:fig}++::: {#tbl:table}+ -- -- --+ + -- -- --++ : Table 1: tbl. 1 fig. 2 fig. 2 (a) fig. 2 (b) lst. 1+:::++::: {#lst:lst .listing .cpp}+Listing 1: Listing tbl. 1 fig. 2 fig. 2 (a) fig. 2 (b) lst. 1++``` cpp+foo+```+:::++:::: {#fig:subfigures .figure .subfigures}+{#fig:subfig1} {#fig:subfig2} ++::: caption+Figure 2: Caption tbl. 1 fig. 2 fig. 2 (a) fig. 2 (b) lst. 1. a ---+tbl. 1 fig. 2 fig. 2 (a) fig. 2 (b) lst. 1, b --- tbl. 1 fig. 2 fig. 2+(a) fig. 2 (b) lst. 1, c --- 3+:::+::::
+ test/m2m/refsInObjects/expect.tex view
@@ -0,0 +1,49 @@+\section{\texorpdfstring{sec.~\ref{sec:hdr}}{sec.~}}\label{sec:hdr}++\begin{figure}+\centering+\pandocbounded{\includegraphics[keepaspectratio,alt={fig.~}]{foo.png}}+\caption{fig.~\ref{fig:fig}}\label{fig:fig}+\end{figure}++\begin{longtable}[]{@{}lll@{}}+\caption{\label{tbl:table}tbl.~\ref{tbl:table} fig.~\ref{fig:subfigures}+fig.~\ref{fig:subfig1} fig.~\ref{fig:subfig2}+lst.~\ref{lst:lst}}\tabularnewline+\toprule\noalign{}+\endfirsthead+\endhead+\bottomrule\noalign{}+\endlastfoot+& & \\+\end{longtable}++\begin{codelisting}++\caption{Listing tbl.~\ref{tbl:table} fig.~\ref{fig:subfigures}+fig.~\ref{fig:subfig1} fig.~\ref{fig:subfig2}+lst.~\ref{lst:lst}}\label{lst:lst}++\begin{Shaded}+\begin{Highlighting}[]+\NormalTok{foo}+\end{Highlighting}+\end{Shaded}++\end{codelisting}++\begin{pandoccrossrefsubfigures}++\begin{subfigure}{0.33\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={tbl.~ fig.~ fig.~ fig.~ lst.~}]{fig1.png}}\caption{tbl.~\ref{tbl:table}+fig.~\ref{fig:subfigures} fig.~\ref{fig:subfig1} fig.~\ref{fig:subfig2}+lst.~\ref{lst:lst}\label{fig:subfig1}}\end{subfigure}%+\begin{subfigure}{0.33\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={tbl.~ fig.~ fig.~ fig.~ lst.~}]{fig2.png}}\caption{tbl.~\ref{tbl:table}+fig.~\ref{fig:subfigures} fig.~\ref{fig:subfig1} fig.~\ref{fig:subfig2}+lst.~\ref{lst:lst}\label{fig:subfig2}}\end{subfigure}%+\begin{subfigure}{0.33\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={3}]{fig3.png}}\caption{3}\end{subfigure}%++\caption{Caption tbl.~\ref{tbl:table} fig.~\ref{fig:subfigures}+fig.~\ref{fig:subfig1} fig.~\ref{fig:subfig2}+lst.~\ref{lst:lst}}\label{fig:subfigures}++\end{pandoccrossrefsubfigures}
+ test/m2m/refsInObjects/input.md view
@@ -0,0 +1,29 @@+---+codeBlockCaptions: true+...++# @sec:hdr {#sec:hdr}++{#fig:fig}++| | | |+|-|-|-|+| | | |++: @tbl:table @fig:subfigures @fig:subfig1 @fig:subfig2 @lst:lst {#tbl:table}++<!---->++```{#lst:lst .cpp}+foo+```++: Listing @tbl:table @fig:subfigures @fig:subfig1 @fig:subfig2 @lst:lst++<div id="fig:subfigures">+ {#fig:subfig1}+ {#fig:subfig2}+ ++ Caption @tbl:table @fig:subfigures @fig:subfig1 @fig:subfig2 @lst:lst+</div>
+ test/m2m/standalone-listOfMetadata/expect.md view
@@ -0,0 +1,245 @@+---+autoEqnLabels: false+autoSectionLabels: false+ccsDelim: ", "+ccsLabelSep: " --- "+ccsTemplate: $$i$$$$ccsLabelSep$$$$t$$+chapDelim: .+chapters: false+chaptersDepth: 1+codeBlockCaptions: true+cref: false+crossrefYaml: pandoc-crossref.yaml+eqLabels: arabic+eqnBlockInlineMath: false+eqnBlockTemplate: |+ +:-------------------------------------------------------------:+------:++ | $$t$$ | $$i$$ |+ +---------------------------------------------------------------+-------++eqnDisplayTemplate: $$e$$+eqnIndexTemplate: ($$i$$)+eqnInlineTableTemplate: $$e$$+eqnInlineTemplate: $$e$$$$equationNumberTeX$${$$i$$}+eqnPrefix:+- eq.+- eqns.+eqnPrefixTemplate: $$p$$ $$i$$+equationNumberTeX: \\qquad+figLabels: arabic+figPrefix:+- fig.+- figs.+figPrefixTemplate: $$p$$ $$i$$+figureTemplate: $$figureTitle$$ $$i$$$$titleDelim$$ $$t$$+figureTitle: Figure+lastDelim: ", "+linkReferences: false+list-of-figures: |+ # List of Figures++ ::: {.list .list-of-fig}+ 1\. 1\++ 2\. 2\++ 3\. 3\++ 4\. 4\++ 5\. 5\++ 6\. 6\++ 7\. 7\++ 8\. 8\++ 9\. 9\+ :::+list-of-listings: |+ # List of Listings++ ::: {.list .list-of-lst}+ 1\. Listing caption 1\++ 2\. Listing caption 2\++ 3\. Listing caption 3\++ 4\. Listing caption 4\+ :::+list-of-tables: |+ # List of Tables++ ::: {.list .list-of-tbl}+ 1\. My table\++ 2\. Table\+ :::+listings: false+listingTemplate: $$listingTitle$$ $$i$$$$titleDelim$$ $$t$$+listingTitle: Listing+listItemTitleDelim: .+listOfMetadata: true+lofItemTemplate: |+ $$lofItemTitle$$$$i$$$$listItemTitleDelim$$ $$t$$\+lofTitle: |+ # List of Figures+lolItemTemplate: |+ $$lolItemTitle$$$$i$$$$listItemTitleDelim$$ $$t$$\+lolTitle: |+ # List of Listings+lotItemTemplate: |+ $$lotItemTitle$$$$i$$$$listItemTitleDelim$$ $$t$$\+lotTitle: |+ # List of Tables+lstLabels: arabic+lstPrefix:+- lst.+- lsts.+lstPrefixTemplate: $$p$$ $$i$$+nameInLink: false+numberSections: false+pairDelim: ", "+rangeDelim: "-"+refDelim: ", "+refIndexTemplate: $$i$$$$suf$$+secHeaderDelim:+secHeaderTemplate: $$i$$$$secHeaderDelim[n]$$$$t$$+secLabels: arabic+secPrefix:+- sec.+- secs.+secPrefixTemplate: $$p$$ $$i$$+sectionsDepth: 0+standalone: true+subfigGrid: false+subfigLabels: alpha a+subfigureChildTemplate: $$i$$+subfigureRefIndexTemplate: $$i$$$$suf$$ ($$s$$)+subfigureTemplate: $$figureTitle$$ $$i$$$$titleDelim$$ $$t$$. $$ccs$$+tableEqns: false+tableTemplate: $$tableTitle$$ $$i$$$$titleDelim$$ $$t$$+tableTitle: Table+tblLabels: arabic+tblPrefix:+- tbl.+- tbls.+tblPrefixTemplate: $$p$$ $$i$$+titleDelim: ":"+---++{#fig:1}++{#fig:2}++{#fig:3}++{#fig:4}++{#fig:5}++{#fig:6}++{#fig:7}++{#fig:8}++{#fig:9}++::: {#lst:code1 .listing .haskell}+Listing 1: Listing caption 1++``` haskell+main :: IO ()+main = putStrLn "Hello World!"+```+:::++::: {#lst:code2 .listing .haskell}+Listing 2: Listing caption 2++``` haskell+main :: IO ()+main = putStrLn "Hello World!"+```+:::++::: {#lst:code3 .listing .haskell}+Listing 3: Listing caption 3++``` haskell+main :: IO ()+main = putStrLn "Hello World!"+```+:::++::: {#lst:code4 .listing .haskell}+Listing 4: Listing caption 4++``` haskell+main :: IO ()+main = putStrLn "Hello World!"+```+:::++------------------------------------------------------------------------++::: {#tbl:mytable}+ a b c+ --- --- ---+ 1 2 3+ 4 5 6++ : Table 1: My table+:::++::: {#tbl:1}+ a b+ --- ---+ 1 2++ : Table 2: Table+:::++# List of Figures++::: {.list .list-of-fig}+1\. 1\++2\. 2\++3\. 3\++4\. 4\++5\. 5\++6\. 6\++7\. 7\++8\. 8\++9\. 9\+:::++# List of Tables++::: {.list .list-of-tbl}+1\. My table\++2\. Table\+:::++# List of Listings++::: {.list .list-of-lst}+1\. Listing caption 1\++2\. Listing caption 2\++3\. Listing caption 3\++4\. Listing caption 4\+:::
+ test/m2m/standalone-listOfMetadata/expect.tex view
@@ -0,0 +1,144 @@+\begin{figure}+\centering+\pandocbounded{\includegraphics[keepaspectratio,alt={1}]{fig1.png}}+\caption{1}\label{fig:1}+\end{figure}++\begin{figure}+\centering+\pandocbounded{\includegraphics[keepaspectratio,alt={2}]{fig2.png}}+\caption{2}\label{fig:2}+\end{figure}++\begin{figure}+\centering+\pandocbounded{\includegraphics[keepaspectratio,alt={3}]{fig3.png}}+\caption{3}\label{fig:3}+\end{figure}++\begin{figure}+\centering+\pandocbounded{\includegraphics[keepaspectratio,alt={4}]{fig4.png}}+\caption{4}\label{fig:4}+\end{figure}++\begin{figure}+\centering+\pandocbounded{\includegraphics[keepaspectratio,alt={5}]{fig5.png}}+\caption{5}\label{fig:5}+\end{figure}++\begin{figure}+\centering+\pandocbounded{\includegraphics[keepaspectratio,alt={6}]{fig6.png}}+\caption{6}\label{fig:6}+\end{figure}++\begin{figure}+\centering+\pandocbounded{\includegraphics[keepaspectratio,alt={7}]{fig7.png}}+\caption{7}\label{fig:7}+\end{figure}++\begin{figure}+\centering+\pandocbounded{\includegraphics[keepaspectratio,alt={8}]{fig8.png}}+\caption{8}\label{fig:8}+\end{figure}++\begin{figure}+\centering+\pandocbounded{\includegraphics[keepaspectratio,alt={9}]{fig9.png}}+\caption{9}\label{fig:9}+\end{figure}++\begin{codelisting}++\caption{Listing caption 1}\label{lst:code1}++\begin{Shaded}+\begin{Highlighting}[]+\OtherTok{main ::} \DataTypeTok{IO}\NormalTok{ ()}+\NormalTok{main }\OtherTok{=} \FunctionTok{putStrLn} \StringTok{"Hello World!"}+\end{Highlighting}+\end{Shaded}++\end{codelisting}++\begin{codelisting}++\caption{Listing caption 2}\label{lst:code2}++\begin{Shaded}+\begin{Highlighting}[]+\OtherTok{main ::} \DataTypeTok{IO}\NormalTok{ ()}+\NormalTok{main }\OtherTok{=} \FunctionTok{putStrLn} \StringTok{"Hello World!"}+\end{Highlighting}+\end{Shaded}++\end{codelisting}++\begin{codelisting}++\caption{Listing caption 3}\label{lst:code3}++\begin{Shaded}+\begin{Highlighting}[]+\OtherTok{main ::} \DataTypeTok{IO}\NormalTok{ ()}+\NormalTok{main }\OtherTok{=} \FunctionTok{putStrLn} \StringTok{"Hello World!"}+\end{Highlighting}+\end{Shaded}++\end{codelisting}++\begin{codelisting}++\caption{Listing caption 4}\label{lst:code4}++\begin{Shaded}+\begin{Highlighting}[]+\OtherTok{main ::} \DataTypeTok{IO}\NormalTok{ ()}+\NormalTok{main }\OtherTok{=} \FunctionTok{putStrLn} \StringTok{"Hello World!"}+\end{Highlighting}+\end{Shaded}++\end{codelisting}++\begin{center}\rule{0.5\linewidth}{0.5pt}\end{center}++\begin{longtable}[]{@{}lll@{}}+\caption{\label{tbl:mytable}My table}\tabularnewline+\toprule\noalign{}+a & b & c \\+\midrule\noalign{}+\endfirsthead+\toprule\noalign{}+a & b & c \\+\midrule\noalign{}+\endhead+\bottomrule\noalign{}+\endlastfoot+1 & 2 & 3 \\+4 & 5 & 6 \\+\end{longtable}++\begin{longtable}[]{@{}ll@{}}+\caption{\label{tbl:1}Table}\tabularnewline+\toprule\noalign{}+a & b \\+\midrule\noalign{}+\endfirsthead+\toprule\noalign{}+a & b \\+\midrule\noalign{}+\endhead+\bottomrule\noalign{}+\endlastfoot+1 & 2 \\+\end{longtable}++\listoffigures++\listoftables++\listoflistings
+ test/m2m/standalone-listOfMetadata/input.md view
@@ -0,0 +1,70 @@+---+standalone: true+listOfMetadata: true+codeBlockCaptions: true+---++{#fig:1}++{#fig:2}++{#fig:3}++{#fig:4}++{#fig:5}++{#fig:6}++{#fig:7}++{#fig:8}++{#fig:9}++```haskell+main :: IO ()+main = putStrLn "Hello World!"+```+: Listing caption 1 {#lst:code1}++```haskell+main :: IO ()+main = putStrLn "Hello World!"+```++: Listing caption 2 {#lst:code2}++```{#lst:code3 .haskell}+main :: IO ()+main = putStrLn "Hello World!"+```+: Listing caption 3++```{#lst:code4 .haskell}+main :: IO ()+main = putStrLn "Hello World!"+```++: Listing caption 4++***++a b c+--- --- ---+1 2 3+4 5 6++: My table {#tbl:mytable}++| a | b |+|---|---|+| 1 | 2 |++: Table {#tbl:1}++\listoffigures++\listoftables++\listoflistings
test/m2m/subfigures-ccsDelim/expect.tex view
@@ -2,17 +2,17 @@ \begin{pandoccrossrefsubfigures} -\subfloat[1]{\pandocbounded{\includegraphics[keepaspectratio,alt={1}]{fig1.png}}\label{fig:subfig1}}-\subfloat[2]{\pandocbounded{\includegraphics[keepaspectratio,alt={2}]{fig2.png}}\label{fig:subfig2}}-\subfloat[3]{\pandocbounded{\includegraphics[keepaspectratio,alt={3}]{fig3.png}}}+\begin{subfigure}{0.33\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={1}]{fig1.png}}\caption{1\label{fig:subfig1}}\end{subfigure}%+\begin{subfigure}{0.33\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={2}]{fig2.png}}\caption{2\label{fig:subfig2}}\end{subfigure}%+\begin{subfigure}{0.33\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={3}]{fig3.png}}\caption{3}\end{subfigure}% -\subfloat[4]{\pandocbounded{\includegraphics[keepaspectratio,alt={4}]{fig4.png}}\label{fig:subfig4}}-\subfloat[5]{\pandocbounded{\includegraphics[keepaspectratio,alt={5}]{fig5.png}}}-\subfloat[6]{\pandocbounded{\includegraphics[keepaspectratio,alt={6}]{fig6.png}}\label{fig:subfig6}}+\begin{subfigure}{0.33\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={4}]{fig4.png}}\caption{4\label{fig:subfig4}}\end{subfigure}%+\begin{subfigure}{0.33\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={5}]{fig5.png}}\caption{5}\end{subfigure}%+\begin{subfigure}{0.33\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={6}]{fig6.png}}\caption{6\label{fig:subfig6}}\end{subfigure}% -\subfloat[7]{\pandocbounded{\includegraphics[keepaspectratio,alt={7}]{fig7.png}}\label{fig:subfig7}}-\subfloat[8]{\pandocbounded{\includegraphics[keepaspectratio,alt={8}]{fig8.png}}}-\subfloat[9]{\pandocbounded{\includegraphics[keepaspectratio,alt={9}]{fig9.png}}\label{fig:subfig9}}+\begin{subfigure}{0.33\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={7}]{fig7.png}}\caption{7\label{fig:subfig7}}\end{subfigure}%+\begin{subfigure}{0.33\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={8}]{fig8.png}}\caption{8}\end{subfigure}%+\begin{subfigure}{0.33\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={9}]{fig9.png}}\caption{9\label{fig:subfig9}}\end{subfigure}% \caption{Caption}\label{fig:subfigures} @@ -20,23 +20,23 @@ \begin{pandoccrossrefsubfigures} -\subfloat[1]{\pandocbounded{\includegraphics[keepaspectratio,alt={1}]{fig1.png}}\label{fig:subfig21}}+\begin{subfigure}{1.0\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={1}]{fig1.png}}\caption{1\label{fig:subfig21}}\end{subfigure}% -\subfloat[2]{\pandocbounded{\includegraphics[keepaspectratio,alt={2}]{fig2.png}}\label{fig:subfig22}}+\begin{subfigure}{1.0\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={2}]{fig2.png}}\caption{2\label{fig:subfig22}}\end{subfigure}% -\subfloat[3]{\pandocbounded{\includegraphics[keepaspectratio,alt={3}]{fig3.png}}}+\begin{subfigure}{1.0\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={3}]{fig3.png}}\caption{3}\end{subfigure}% -\subfloat[4]{\pandocbounded{\includegraphics[keepaspectratio,alt={4}]{fig4.png}}\label{fig:subfig24}}+\begin{subfigure}{1.0\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={4}]{fig4.png}}\caption{4\label{fig:subfig24}}\end{subfigure}% -\subfloat[5]{\pandocbounded{\includegraphics[keepaspectratio,alt={5}]{fig5.png}}}+\begin{subfigure}{1.0\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={5}]{fig5.png}}\caption{5}\end{subfigure}% -\subfloat[6]{\pandocbounded{\includegraphics[keepaspectratio,alt={6}]{fig6.png}}\label{fig:subfig26}}+\begin{subfigure}{1.0\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={6}]{fig6.png}}\caption{6\label{fig:subfig26}}\end{subfigure}% -\subfloat[7]{\pandocbounded{\includegraphics[keepaspectratio,alt={7}]{fig7.png}}\label{fig:subfig27}}+\begin{subfigure}{1.0\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={7}]{fig7.png}}\caption{7\label{fig:subfig27}}\end{subfigure}% -\subfloat[8]{\pandocbounded{\includegraphics[keepaspectratio,alt={8}]{fig8.png}}}+\begin{subfigure}{1.0\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={8}]{fig8.png}}\caption{8}\end{subfigure}% -\subfloat[9]{\pandocbounded{\includegraphics[keepaspectratio,alt={9}]{fig9.png}}\label{fig:subfig29}}+\begin{subfigure}{1.0\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={9}]{fig9.png}}\caption{9\label{fig:subfig29}}\end{subfigure}% \caption{Caption}\label{fig:subfigures2}
+ test/m2m/subfigures-columns/expect.md view
@@ -0,0 +1,78 @@+You can define subfigures:++:::::::::::::::: {#fig:subfigures .figure .subfigures}+:::::: columns+::: {.column width="33.0%"}+{#fig:subfig1}+:::++::: {.column width="33.0%"}+{#fig:subfig2}+:::++::: {.column width="33.0%"}++:::+::::::++:::::: columns+::: {.column width="33.0%"}+{#fig:subfig4}+:::++::: {.column width="33.0%"}++:::++::: {.column width="33.0%"}+{#fig:subfig6}+:::+::::::++:::::: columns+::: {.column width="33.0%"}+{#fig:subfig7}+:::++::: {.column width="33.0%"}++:::++::: {.column width="33.0%"}+{#fig:subfig9}+:::+::::::++::: caption+Figure 1: Caption. a --- 1, b --- 2, c --- 3, d --- 4, e --- 5, f --- 6,+g --- 7, h --- 8, i --- 9+:::+::::::::::::::::++:::: {#fig:subfigures2 .figure .subfigures}+{#fig:subfig21}++{#fig:subfig22}++++{#fig:subfig24}++++{#fig:subfig26}++{#fig:subfig27}++++{#fig:subfig29}++::: caption+Figure 2: Caption. a --- 1, b --- 2, c --- 3, d --- 4, e --- 5, f --- 6,+g --- 7, h --- 8, i --- 9+:::+::::++Figures themselves can be referenced fig. 2, as well as individual+subfigures: figs. 1 (a), 1 (b), 2 (i)
+ test/m2m/subfigures-columns/expect.tex view
@@ -0,0 +1,47 @@+You can define subfigures:++\begin{pandoccrossrefsubfigures}++\begin{subfigure}{0.33\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={1}]{fig1.png}}\caption{1\label{fig:subfig1}}\end{subfigure}%+\begin{subfigure}{0.33\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={2}]{fig2.png}}\caption{2\label{fig:subfig2}}\end{subfigure}%+\begin{subfigure}{0.33\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={3}]{fig3.png}}\caption{3}\end{subfigure}%++\begin{subfigure}{0.33\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={4}]{fig4.png}}\caption{4\label{fig:subfig4}}\end{subfigure}%+\begin{subfigure}{0.33\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={5}]{fig5.png}}\caption{5}\end{subfigure}%+\begin{subfigure}{0.33\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={6}]{fig6.png}}\caption{6\label{fig:subfig6}}\end{subfigure}%++\begin{subfigure}{0.33\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={7}]{fig7.png}}\caption{7\label{fig:subfig7}}\end{subfigure}%+\begin{subfigure}{0.33\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={8}]{fig8.png}}\caption{8}\end{subfigure}%+\begin{subfigure}{0.33\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={9}]{fig9.png}}\caption{9\label{fig:subfig9}}\end{subfigure}%++\caption{Caption}\label{fig:subfigures}++\end{pandoccrossrefsubfigures}++\begin{pandoccrossrefsubfigures}++\begin{subfigure}{1.0\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={1}]{fig1.png}}\caption{1\label{fig:subfig21}}\end{subfigure}%++\begin{subfigure}{1.0\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={2}]{fig2.png}}\caption{2\label{fig:subfig22}}\end{subfigure}%++\begin{subfigure}{1.0\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={3}]{fig3.png}}\caption{3}\end{subfigure}%++\begin{subfigure}{1.0\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={4}]{fig4.png}}\caption{4\label{fig:subfig24}}\end{subfigure}%++\begin{subfigure}{1.0\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={5}]{fig5.png}}\caption{5}\end{subfigure}%++\begin{subfigure}{1.0\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={6}]{fig6.png}}\caption{6\label{fig:subfig26}}\end{subfigure}%++\begin{subfigure}{1.0\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={7}]{fig7.png}}\caption{7\label{fig:subfig27}}\end{subfigure}%++\begin{subfigure}{1.0\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={8}]{fig8.png}}\caption{8}\end{subfigure}%++\begin{subfigure}{1.0\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={9}]{fig9.png}}\caption{9\label{fig:subfig29}}\end{subfigure}%++\caption{Caption}\label{fig:subfigures2}++\end{pandoccrossrefsubfigures}++Figures themselves can be referenced fig.~\ref{fig:subfigures2}, as well+as individual subfigures:+figs.~\ref{fig:subfig1}, \ref{fig:subfig2}, \ref{fig:subfig29}
+ test/m2m/subfigures-columns/input.md view
@@ -0,0 +1,44 @@+---+subfigColumns: true+---+You can define subfigures:++<div id="fig:subfigures">+ {#fig:subfig1}+ {#fig:subfig2}+ ++ {#fig:subfig4}+ + {#fig:subfig6}++ {#fig:subfig7}+ + {#fig:subfig9}++ Caption+</div>++<div id="fig:subfigures2">+ {#fig:subfig21}++ {#fig:subfig22}++ ++ {#fig:subfig24}++ ++ {#fig:subfig26}++ {#fig:subfig27}++ ++ {#fig:subfig29}++ Caption+</div>++Figures themselves can be referenced @fig:subfigures2, as well as individual subfigures: [@fig:subfig1; @fig:subfig2; @fig:subfig29]
test/m2m/subfigures-grid/expect.tex view
@@ -2,17 +2,17 @@ \begin{pandoccrossrefsubfigures} -\subfloat[1]{\includegraphics[width=0.3\linewidth,height=\textheight,keepaspectratio,alt={1}]{fig1.png}\label{fig:subfig1}}-\subfloat[2]{\includegraphics[width=0.3\linewidth,height=\textheight,keepaspectratio,alt={2}]{fig2.png}\label{fig:subfig2}}-\subfloat[3]{\includegraphics[width=0.3\linewidth,height=\textheight,keepaspectratio,alt={3}]{fig3.png}}+\begin{subfigure}{0.3\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={1}]{fig1.png}}\caption{1\label{fig:subfig1}}\end{subfigure}%+\begin{subfigure}{0.3\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={2}]{fig2.png}}\caption{2\label{fig:subfig2}}\end{subfigure}%+\begin{subfigure}{0.3\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={3}]{fig3.png}}\caption{3}\end{subfigure}% -\subfloat[4]{\includegraphics[width=0.3\linewidth,height=\textheight,keepaspectratio,alt={4}]{fig4.png}\label{fig:subfig4}}-\subfloat[5]{\includegraphics[width=0.3\linewidth,height=\textheight,keepaspectratio,alt={5}]{fig5.png}}-\subfloat[6]{\includegraphics[width=0.3\linewidth,height=\textheight,keepaspectratio,alt={6}]{fig6.png}\label{fig:subfig6}}+\begin{subfigure}{0.3\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={4}]{fig4.png}}\caption{4\label{fig:subfig4}}\end{subfigure}%+\begin{subfigure}{0.3\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={5}]{fig5.png}}\caption{5}\end{subfigure}%+\begin{subfigure}{0.3\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={6}]{fig6.png}}\caption{6\label{fig:subfig6}}\end{subfigure}% -\subfloat[7]{\includegraphics[width=0.3\linewidth,height=\textheight,keepaspectratio,alt={7}]{fig7.png}\label{fig:subfig7}}-\subfloat[8]{\includegraphics[width=0.3\linewidth,height=\textheight,keepaspectratio,alt={8}]{fig8.png}}-\subfloat[9]{\includegraphics[width=0.3\linewidth,height=\textheight,keepaspectratio,alt={9}]{fig9.png}\label{fig:subfig9}}+\begin{subfigure}{0.3\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={7}]{fig7.png}}\caption{7\label{fig:subfig7}}\end{subfigure}%+\begin{subfigure}{0.3\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={8}]{fig8.png}}\caption{8}\end{subfigure}%+\begin{subfigure}{0.3\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={9}]{fig9.png}}\caption{9\label{fig:subfig9}}\end{subfigure}% \caption{Caption}\label{fig:subfigures} @@ -20,23 +20,23 @@ \begin{pandoccrossrefsubfigures} -\subfloat[1]{\pandocbounded{\includegraphics[keepaspectratio,alt={1}]{fig1.png}}\label{fig:subfig21}}+\begin{subfigure}{1.0\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={1}]{fig1.png}}\caption{1\label{fig:subfig21}}\end{subfigure}% -\subfloat[2]{\pandocbounded{\includegraphics[keepaspectratio,alt={2}]{fig2.png}}\label{fig:subfig22}}+\begin{subfigure}{1.0\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={2}]{fig2.png}}\caption{2\label{fig:subfig22}}\end{subfigure}% -\subfloat[3]{\pandocbounded{\includegraphics[keepaspectratio,alt={3}]{fig3.png}}}+\begin{subfigure}{1.0\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={3}]{fig3.png}}\caption{3}\end{subfigure}% -\subfloat[4]{\pandocbounded{\includegraphics[keepaspectratio,alt={4}]{fig4.png}}\label{fig:subfig24}}+\begin{subfigure}{1.0\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={4}]{fig4.png}}\caption{4\label{fig:subfig24}}\end{subfigure}% -\subfloat[5]{\pandocbounded{\includegraphics[keepaspectratio,alt={5}]{fig5.png}}}+\begin{subfigure}{1.0\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={5}]{fig5.png}}\caption{5}\end{subfigure}% -\subfloat[6]{\pandocbounded{\includegraphics[keepaspectratio,alt={6}]{fig6.png}}\label{fig:subfig26}}+\begin{subfigure}{1.0\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={6}]{fig6.png}}\caption{6\label{fig:subfig26}}\end{subfigure}% -\subfloat[7]{\pandocbounded{\includegraphics[keepaspectratio,alt={7}]{fig7.png}}\label{fig:subfig27}}+\begin{subfigure}{1.0\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={7}]{fig7.png}}\caption{7\label{fig:subfig27}}\end{subfigure}% -\subfloat[8]{\pandocbounded{\includegraphics[keepaspectratio,alt={8}]{fig8.png}}}+\begin{subfigure}{1.0\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={8}]{fig8.png}}\caption{8}\end{subfigure}% -\subfloat[9]{\pandocbounded{\includegraphics[keepaspectratio,alt={9}]{fig9.png}}\label{fig:subfig29}}+\begin{subfigure}{1.0\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={9}]{fig9.png}}\caption{9\label{fig:subfig29}}\end{subfigure}% \caption{Caption}\label{fig:subfigures2}
test/m2m/subfigures-one-row/expect.tex view
@@ -5,10 +5,10 @@ \begin{pandoccrossrefsubfigures} -\subfloat[cool-caption]{\includegraphics[width=0.4\linewidth,height=\textheight,keepaspectratio,alt={cool caption}]{/tmp/LaTeX_logo.svg.png}\label{fig:logo1}}-\subfloat[cooler-caption]{\includegraphics[width=0.4\linewidth,height=\textheight,keepaspectratio,alt={cooler caption}]{/tmp/LaTeX_logo.svg.png}\label{fig:logo2}}+\begin{subfigure}{0.4\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={cool caption}]{/tmp/LaTeX_logo.svg.png}}\caption{cool+caption\label{fig:logo1}}\end{subfigure}%+\begin{subfigure}{0.4\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={cooler caption}]{/tmp/LaTeX_logo.svg.png}}\caption{cooler+caption\label{fig:logo2}}\end{subfigure}% \caption{Copies of the LaTeX logo}\label{fig:latex}
test/m2m/subfigures/expect.tex view
@@ -2,17 +2,17 @@ \begin{pandoccrossrefsubfigures} -\subfloat[1]{\pandocbounded{\includegraphics[keepaspectratio,alt={1}]{fig1.png}}\label{fig:subfig1}}-\subfloat[2]{\pandocbounded{\includegraphics[keepaspectratio,alt={2}]{fig2.png}}\label{fig:subfig2}}-\subfloat[3]{\pandocbounded{\includegraphics[keepaspectratio,alt={3}]{fig3.png}}}+\begin{subfigure}{0.33\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={1}]{fig1.png}}\caption{1\label{fig:subfig1}}\end{subfigure}%+\begin{subfigure}{0.33\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={2}]{fig2.png}}\caption{2\label{fig:subfig2}}\end{subfigure}%+\begin{subfigure}{0.33\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={3}]{fig3.png}}\caption{3}\end{subfigure}% -\subfloat[4]{\pandocbounded{\includegraphics[keepaspectratio,alt={4}]{fig4.png}}\label{fig:subfig4}}-\subfloat[5]{\pandocbounded{\includegraphics[keepaspectratio,alt={5}]{fig5.png}}}-\subfloat[6]{\pandocbounded{\includegraphics[keepaspectratio,alt={6}]{fig6.png}}\label{fig:subfig6}}+\begin{subfigure}{0.33\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={4}]{fig4.png}}\caption{4\label{fig:subfig4}}\end{subfigure}%+\begin{subfigure}{0.33\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={5}]{fig5.png}}\caption{5}\end{subfigure}%+\begin{subfigure}{0.33\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={6}]{fig6.png}}\caption{6\label{fig:subfig6}}\end{subfigure}% -\subfloat[7]{\pandocbounded{\includegraphics[keepaspectratio,alt={7}]{fig7.png}}\label{fig:subfig7}}-\subfloat[8]{\pandocbounded{\includegraphics[keepaspectratio,alt={8}]{fig8.png}}}-\subfloat[9]{\pandocbounded{\includegraphics[keepaspectratio,alt={9}]{fig9.png}}\label{fig:subfig9}}+\begin{subfigure}{0.33\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={7}]{fig7.png}}\caption{7\label{fig:subfig7}}\end{subfigure}%+\begin{subfigure}{0.33\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={8}]{fig8.png}}\caption{8}\end{subfigure}%+\begin{subfigure}{0.33\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={9}]{fig9.png}}\caption{9\label{fig:subfig9}}\end{subfigure}% \caption{Caption}\label{fig:subfigures} @@ -20,23 +20,23 @@ \begin{pandoccrossrefsubfigures} -\subfloat[1]{\pandocbounded{\includegraphics[keepaspectratio,alt={1}]{fig1.png}}\label{fig:subfig21}}+\begin{subfigure}{1.0\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={1}]{fig1.png}}\caption{1\label{fig:subfig21}}\end{subfigure}% -\subfloat[2]{\pandocbounded{\includegraphics[keepaspectratio,alt={2}]{fig2.png}}\label{fig:subfig22}}+\begin{subfigure}{1.0\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={2}]{fig2.png}}\caption{2\label{fig:subfig22}}\end{subfigure}% -\subfloat[3]{\pandocbounded{\includegraphics[keepaspectratio,alt={3}]{fig3.png}}}+\begin{subfigure}{1.0\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={3}]{fig3.png}}\caption{3}\end{subfigure}% -\subfloat[4]{\pandocbounded{\includegraphics[keepaspectratio,alt={4}]{fig4.png}}\label{fig:subfig24}}+\begin{subfigure}{1.0\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={4}]{fig4.png}}\caption{4\label{fig:subfig24}}\end{subfigure}% -\subfloat[5]{\pandocbounded{\includegraphics[keepaspectratio,alt={5}]{fig5.png}}}+\begin{subfigure}{1.0\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={5}]{fig5.png}}\caption{5}\end{subfigure}% -\subfloat[6]{\pandocbounded{\includegraphics[keepaspectratio,alt={6}]{fig6.png}}\label{fig:subfig26}}+\begin{subfigure}{1.0\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={6}]{fig6.png}}\caption{6\label{fig:subfig26}}\end{subfigure}% -\subfloat[7]{\pandocbounded{\includegraphics[keepaspectratio,alt={7}]{fig7.png}}\label{fig:subfig27}}+\begin{subfigure}{1.0\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={7}]{fig7.png}}\caption{7\label{fig:subfig27}}\end{subfigure}% -\subfloat[8]{\pandocbounded{\includegraphics[keepaspectratio,alt={8}]{fig8.png}}}+\begin{subfigure}{1.0\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={8}]{fig8.png}}\caption{8}\end{subfigure}% -\subfloat[9]{\pandocbounded{\includegraphics[keepaspectratio,alt={9}]{fig9.png}}\label{fig:subfig29}}+\begin{subfigure}{1.0\linewidth}\pandocbounded{\includegraphics[keepaspectratio,alt={9}]{fig9.png}}\caption{9\label{fig:subfig29}}\end{subfigure}% \caption{Caption}\label{fig:subfigures2}
test/test-integrative.hs view
@@ -26,6 +26,7 @@ import System.FilePath import System.Directory import Control.Monad+import Data.Maybe import Text.Pandoc.Highlighting import qualified Data.Text as T @@ -41,17 +42,26 @@ input <- runIO $ readFile ("test" </> "m2m" </> dir </> "input.md") expect_md <- runIO $ readFile ("test" </> "m2m" </> dir </> "expect.md") let ro = def { readerExtensions = pandocExtensions }- wo = def { writerExtensions = disableExtension Ext_raw_html $ disableExtension Ext_raw_attribute pandocExtensions- , writerHighlightStyle=Just pygments- , writerListings = dir `elem` listingsDirs } p@(Pandoc meta _) <- runIO $ either (error . show) id <$> P.runIO (readMarkdown ro $ T.pack input)+ let standalone = isJust $ lookupMeta "standalone" meta+ template <- runIO $ either (error . show) id <$> P.runIO (compileDefaultTemplate "markdown")+ let wo = def { writerExtensions+ = disableExtension Ext_raw_html+ $ disableExtension Ext_raw_attribute+ $ pandocExtensions+ , writerHighlightMethod = if dir `elem` listingsDirs+ then IdiomaticHighlighting+ else Skylighting pygments+ , writerTemplate = if standalone then Just template else Nothing+ }+ woTex = wo { writerTemplate = Nothing } let actual_md = either (fail . show) T.unpack $ runPure $ writeMarkdown wo $ runCrossRef meta (Just $ Format "markdown") defaultCrossRefAction p it "Markdown" $ do zipWithM_ shouldBe (lines' actual_md) (lines' expect_md) length' (lines' actual_md) `shouldBe` length' (lines' expect_md) #ifdef FLAKY expect_tex <- runIO $ readFile ("test" </> "m2m" </> dir </> "expect.tex")- let actual_tex = either (fail . show) T.unpack $ runPure $ writeLaTeX wo $ runCrossRef meta (Just $ Format "latex") defaultCrossRefAction p+ let actual_tex = either (fail . show) T.unpack $ runPure $ writeLaTeX woTex $ runCrossRef meta (Just $ Format "latex") defaultCrossRefAction p it "LaTeX" $ do zipWithM_ shouldBe (lines' actual_tex) (lines' expect_tex) length' (lines' actual_tex) `shouldBe` length' (lines' expect_tex)
test/test-pandoc-crossref.hs view
@@ -19,17 +19,17 @@ -} {-# LANGUAGE CPP, OverloadedLists #-}+{-# OPTIONS_GHC -Wno-orphans #-} import Test.Hspec import Text.Pandoc hiding (getDataFileName) import Text.Pandoc.Builder hiding (figure) import qualified Text.Pandoc.Builder as B-import Control.Monad.Reader-import Control.Monad.State import Data.List import Control.Arrow import qualified Data.Map as M import qualified Data.Text as T import Data.Maybe+import Lens.Micro.Mtl import Text.Pandoc.CrossRef import Text.Pandoc.CrossRef.Util.Options@@ -42,6 +42,7 @@ import qualified Text.Pandoc.CrossRef.References.List as References.List import qualified Text.Pandoc.CrossRef.Util.Template as Util.Template import qualified Text.Pandoc.CrossRef.Util.CodeBlockCaptions as Util.CodeBlockCaptions+import Data.String (IsString(..)) import qualified Native import Paths_pandoc_crossref@@ -107,13 +108,13 @@ ( figureWith ("fig:subfigure",["subfigures"],[]) (caption Nothing $ para (text "Figure 1: figure caption. a — Test figure 1, b — Test figure 2"))- ( para (figure' "test1.jpg" "" "a" "figure1")- <> para (figure' "test2.jpg" "" "b" "figure2")+ ( figure "test1.jpg" "" "a" Nothing "figure1"+ <> figure "test2.jpg" "" "b" Nothing "figure2" ) <> figureWith ("fig:subfigure2",["subfigures"],[]) (caption Nothing $ para (text "Figure 2: figure caption 2. a — Test figure 21, b — Test figure 22"))- ( para (figure' "test21.jpg" "" "a" "figure21")- <> para (figure' "test22.jpg" "" "b" "figure22")+ ( figure "test21.jpg" "" "a" Nothing "figure21"+ <> figure "test22.jpg" "" "b" Nothing "figure22" ) , PfxImg =: M.fromList [("fig:figure1",RefRec { refIndex = [(1,Nothing)],@@ -362,24 +363,30 @@ <> para (citeGen "lst:some_codeblock" [1]) `test1` "\\begin{codelisting}\n\n\\caption{A code block}\\label{lst:some_codeblock1}\n\n\\begin{Shaded}\n\\begin{Highlighting}[]\n\\OtherTok{main ::} \\DataTypeTok{IO}\\NormalTok{ ()}\n\\end{Highlighting}\n\\end{Shaded}\n\n\\end{codelisting}\n\nlst.~\\ref{lst:some_codeblock1}" +instance IsString RefIndex where+ fromString (T.pack -> s) =+ case find @[] (\pfx -> s `hasPfx` pfx) [minBound..] of+ Just pfx -> IdxRef pfx s+ Nothing -> error $ "Invalid reference: " <> T.unpack s+ citeGen :: T.Text -> [Int] -> Inlines citeGen p l = cite (mconcat $ map (cit . (p<>) . T.pack . show) l) $ text $ "[" <> T.intercalate "; " (map (("@"<>) . (p<>) . T.pack . show) l) <> "]" -refGen :: T.Text -> [Int] -> [Int] -> M.Map T.Text RefRec+refGen :: T.Text -> [Int] -> [Int] -> M.Map RefIndex RefRec refGen p l1 l2 = M.fromList $ mconcat $ zipWith refRec'' (((uncapitalizeFirst p<>) . T.pack . show) `map` l1) l2 -refGen' :: T.Text -> [Int] -> [(Int, Int)] -> M.Map T.Text RefRec+refGen' :: T.Text -> [Int] -> [(Int, Int)] -> M.Map RefIndex RefRec refGen' p l1 l2 = M.fromList $ mconcat $ zipWith refRec''' (((uncapitalizeFirst p<>) . T.pack . show) `map` l1) l2 -refRec' :: T.Text -> Int -> T.Text -> [(T.Text, RefRec)]-refRec' ref i tit = [(ref, RefRec{refLabel=Just ref,refIndex=[(i,Nothing)],refGlobal=0,refHideFromList=False,refTitle=toList $ text tit,refSubfigure=Nothing})]+refRec' :: T.Text -> Int -> T.Text -> [(RefIndex, RefRec)]+refRec' ref i tit = [(fromString $ T.unpack ref, RefRec{refLabel=Just ref,refIndex=[(i,Nothing)],refGlobal=0,refHideFromList=False,refTitle=toList $ text tit,refSubfigure=Nothing})] -refRec'' :: T.Text -> Int -> [(T.Text, RefRec)]+refRec'' :: T.Text -> Int -> [(RefIndex, RefRec)] refRec'' ref i = refRec' ref i "" -refRec''' :: T.Text -> (Int, Int) -> [(T.Text, RefRec)]-refRec''' ref (c,i) = [(ref, RefRec{refLabel=Just ref,refIndex=[(c,Nothing), (i,Nothing)],refGlobal=0,refHideFromList=False,refTitle=toList $ text "",refSubfigure=Nothing})]+refRec''' :: T.Text -> (Int, Int) -> [(RefIndex, RefRec)]+refRec''' ref (c,i) = [(fromString $ T.unpack ref, RefRec{refLabel=Just ref,refIndex=[(c,Nothing), (i,Nothing)],refGlobal=0,refHideFromList=False,refTitle=toList $ text "",refSubfigure=Nothing})] testRefs' :: T.Text -> [Int] -> [Int] -> Prefix -> T.Text -> Expectation testRefs' p l1 l2 prop res = testRefs (para $ citeGen p l1) (set (refsAt prop) (refGen p l1 l2) def) (para $ text res)@@ -394,25 +401,40 @@ testState f init' arg res = runWSWithOptsInit defaultOptions init' (f $ toList arg) `shouldBe` first toList res runWSWithOptsInit :: Options -> References -> WS a -> (a, References)-runWSWithOptsInit opts st = flip runState st . flip runReaderT opts . runWS--runWSWithOpts :: Options -> WS a -> (a, References)-runWSWithOpts opts = runWSWithOptsInit opts def+runWSWithOptsInit opts st act = runWS (WState opts st) act & _2 %~ view wsReferences testRefs :: Blocks -> References -> Blocks -> Expectation-testRefs bs st rbs = testState (bottomUpM References.Refs.replaceRefs) st bs (rbs, st)+testRefs bs st rbs = testState (bottomUpM replaceRefs') st bs (rbs, st) +replaceRefs' :: [Inline] -> WS [Inline]+replaceRefs' (x:xs) = do+ x' <- replaceRefOne x+ pure $ toList $ x' <> fromList xs+replaceRefs' [] = pure []++replaceRefOne :: Inline -> WS Inlines+replaceRefOne = \case+ Cite cits _ -> References.Refs.replaceRefs cits <$> use wsOptions <*> use wsReferences+ x -> pure $ fromList [x]+ testCBCaptions :: Blocks -> Blocks -> Expectation-testCBCaptions bs res = runWSWithOpts defaultOptions{Text.Pandoc.CrossRef.Util.Options.codeBlockCaptions=True}- (bottomUpM (Util.CodeBlockCaptions.mkCodeBlockCaptions) (toList bs)) `shouldBe` (toList res,def)+testCBCaptions bs res =+ let opts = defaultOptions{Text.Pandoc.CrossRef.Util.Options.codeBlockCaptions=True}+ in (bottomUp (\bs' -> fromMaybe bs' $ Util.CodeBlockCaptions.mkCodeBlockCaptions opts bs') (toList bs)) `shouldBe` toList res testList :: Blocks -> References -> Blocks -> Expectation-testList bs st res = runWSWithOptsInit defaultOptions st (bottomUpM References.List.listOf (toList bs))+testList bs st res = runWSWithOptsInit defaultOptions st (bottomUpM listOf' (toList bs)) `shouldBe` (toList res,st) +listOf' :: [Block] -> WS [Block]+listOf' (x:xs) = References.List.listOf x <$> use wsOptions <*> use wsReferences <&> \case+ Just res' -> res' <> xs+ Nothing -> x : xs+listOf' [] = pure []+ figure :: T.Text -> T.Text -> T.Text -> Maybe T.Text -> T.Text -> Blocks figure src title cap malt ref = B.figureWith ("fig:" <> ref, [], [])- (caption Nothing $ para $ text cap) $ plain $ figure' src title (fromMaybe cap malt) ""+ (caption Nothing $ plain $ text cap) $ plain $ figure' src title (fromMaybe cap malt) "" figure' :: T.Text -> T.Text -> T.Text -> T.Text -> Inlines figure' src title alt ref = imageWith (if T.null ref then mempty else "fig:" <> ref, [], []) src title (text alt)@@ -475,7 +497,7 @@ cit r = [defCit{citationId=r}] infixr 0 =:-(=:) :: Prefix -> M.Map T.Text RefRec -> References+(=:) :: Prefix -> M.Map RefIndex RefRec -> References a =: b = def & ctrsAt a .~ (refIndex $ last $ M.elems b) & refsAt a .~ b