JATS writer: fix XML output for nested figures

Subfigures are now wrapped inside a `<fig-group>` element. Furthermore,
figure content that isn't allowed as children of `<fig>` elements, such
as raw text, gets wrapped in `<p>` elements to ensure schema-conform
XML production.

Fixes: #11342
This commit is contained in:
Albert Krewinkel
2025-12-11 19:57:54 +01:00
parent 20973b12cc
commit 47ada83bcb
2 changed files with 63 additions and 6 deletions
+30 -6
View File
@@ -439,12 +439,36 @@ blockToJATS opts (Figure (ident, _, kvs) (Caption _short longcapt) body) = do
capt <- if null longcapt
then pure empty
else inTagsSimple "caption" <$> blocksToJATS opts longcapt
figbod <- blocksToJATS opts $ walk unsetAltIfDupl body
let figattr = [("id", escapeNCName ident) | not (T.null ident)] ++
[(k,v) | (k,v) <- kvs
, k `elem` [ "fig-type", "orientation"
, "position", "specific-use"]]
return $ inTags True "fig" figattr $ capt $$ figbod
-- We handle the element specially if it's a figure with subfigures, i.e., if
-- all immediate children are figures themselves.
let hasSubfigures = all (\case { Figure{} -> True; _ -> False}) body
needsWrapping = if hasSubfigures
then (const False)
else \case
-- Wrap all figure content elements, except for those
-- allowed as direct subelements.
BlockQuote{} -> False
CodeBlock{} -> False
Para{} -> False
Plain [Image{}] -> False
Plain [Math{}] -> False
Table{} -> False
_ -> True
children <- wrappedBlocksToJATS needsWrapping opts $ walk unsetAltIfDupl body
let (tag, allowedAttributes) =
if hasSubfigures
then ( "fig-group"
, ["content-type", "orientation", "position", "specific-use"]
)
else ("fig"
, ["fig-type", "orientation", "position", "specific-use"]
)
let xmlattr = [("id", escapeNCName ident) | not (T.null ident)] ++
[(k,v) | (k,v) <- kvs
, k `elem` allowedAttributes]
return $ inTags True tag xmlattr $ capt $$ children
-- | Convert a list of inline elements to JATS.
inlinesToJATS :: PandocMonad m => WriterOptions -> [Inline] -> JATS m (Doc Text)
+33
View File
@@ -0,0 +1,33 @@
Subfigures should be converted to *fig-group* elements.
```
% pandoc -f latex -t jats
\begin{figure}[H]
\begin{subfigure}
\centering
\includegraphics[height=1.5in]{assets/A.png}
\caption{Graph for function *A*.}
\label{fig:A}
\end{subfigure}
\begin{subfigure}
\centering
\includegraphics[height=1.5in]{assets/B.png}
\caption{Graph for function *B*.}
\label{fig:B}
\end{subfigure}
\label{fig:graphs}
\caption{Function graphs.}
\end{figure}
^D
<fig-group id="figU003Agraphs">
<caption><p>Function graphs.</p></caption>
<fig id="figU003AA">
<caption><p>Graph for function *A*.</p></caption>
<graphic mimetype="image" mime-subtype="png" xlink:href="assets/A.png" />
</fig>
<fig id="figU003AB">
<caption><p>Graph for function *B*.</p></caption>
<graphic mimetype="image" mime-subtype="png" xlink:href="assets/B.png" />
</fig>
</fig-group>
```