aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/format-validation.yml31
-rw-r--r--src/Text/Pandoc/Writers/JATS.hs5
-rw-r--r--src/Text/Pandoc/Writers/JATS/Table.hs262
-rw-r--r--test/Tests/Old.hs2
-rw-r--r--test/tables.jats_archiving204
-rw-r--r--test/tables.jats_articleauthoring204
-rw-r--r--test/tables.jats_publishing204
-rw-r--r--test/tables/nordics.jats_archiving58
-rw-r--r--test/tables/planets.jats_archiving128
-rw-r--r--test/tables/students.jats_archiving56
10 files changed, 775 insertions, 379 deletions
diff --git a/.github/workflows/format-validation.yml b/.github/workflows/format-validation.yml
index 2104f9da1..a0a5b34b7 100644
--- a/.github/workflows/format-validation.yml
+++ b/.github/workflows/format-validation.yml
@@ -10,6 +10,9 @@ on:
- 'test/writer.jats_publishing'
- 'test/writer.jats_archiving'
- 'test/tables.jats_archiving'
+ - 'test/tables/nordics.jats_archiving'
+ - 'test/tables/planets.jats_archiving'
+ - 'test/tables/students.jats_archiving'
pull_request:
branches:
- '*'
@@ -19,6 +22,9 @@ on:
- 'test/writer.jats_publishing'
- 'test/writer.jats_archiving'
- 'test/tables.jats_archiving'
+ - 'test/tables/nordics.jats_archiving'
+ - 'test/tables/planets.jats_archiving'
+ - 'test/tables/students.jats_archiving'
jobs:
jats:
@@ -65,13 +71,18 @@ jobs:
EOF
)"
jats_file="$(mktemp jats-tables.XXXXX)"
- printf "$tmpl" "$(cat test/tables.jats_archiving)" > "$jats_file"
- json="$(curl --form "xml=@${jats_file}" --silent "$VALIDATOR_URL")"
- err_count="$(printf "%s" "$json" | jq '.errors | length')"
- if [ "$err_count" -eq 0 ]; then
- printf "Table output is valid when used as body content.\n"
- exit 0
- else
- printf "Validator report:\n%s" "$json"
- exit 1
- fi
+ exit_code=0
+ for f in tables tables/nordics tables/planets tables/students; do
+ filename=test/$f.jats_archiving
+ printf "Validating %s...\n" "$filename"
+ printf "$tmpl" "$(cat $filename)" > "$jats_file"
+ json="$(curl --form "xml=@${jats_file}" --silent "$VALIDATOR_URL")"
+ err_count="$(printf "%s" "$json" | jq '.errors | length')"
+ if [ "$err_count" -eq 0 ]; then
+ printf "Table output is valid when used as body content.\n"
+ else
+ printf "Validator report:\n%s" "$json"
+ exit_code=1
+ fi
+ done
+ exit "$exit_code"
diff --git a/src/Text/Pandoc/Writers/JATS.hs b/src/Text/Pandoc/Writers/JATS.hs
index 0ddb70c83..7058a4557 100644
--- a/src/Text/Pandoc/Writers/JATS.hs
+++ b/src/Text/Pandoc/Writers/JATS.hs
@@ -46,6 +46,7 @@ import Text.Pandoc.Writers.Math
import Text.Pandoc.Writers.Shared
import Text.Pandoc.XML
import Text.TeXMath
+import qualified Text.Pandoc.Writers.AnnotatedTable as Ann
import qualified Text.XML.Light as Xml
-- | Convert a @'Pandoc'@ document to JATS (Archiving and Interchange
@@ -349,8 +350,8 @@ blockToJATS _ b@(RawBlock f str)
report $ BlockNotRendered b
return empty
blockToJATS _ HorizontalRule = return empty -- not semantic
-blockToJATS opts (Table attr blkCapt specs th tb tf) =
- tableToJATS opts attr blkCapt specs th tb tf
+blockToJATS opts (Table attr caption colspecs thead tbody tfoot) =
+ tableToJATS opts (Ann.toTable attr caption colspecs thead tbody tfoot)
-- | Convert a list of inline elements to JATS.
inlinesToJATS :: PandocMonad m => WriterOptions -> [Inline] -> JATS m (Doc Text)
diff --git a/src/Text/Pandoc/Writers/JATS/Table.hs b/src/Text/Pandoc/Writers/JATS/Table.hs
index dd7678f63..a4d42832d 100644
--- a/src/Text/Pandoc/Writers/JATS/Table.hs
+++ b/src/Text/Pandoc/Writers/JATS/Table.hs
@@ -1,4 +1,6 @@
+{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE TupleSections #-}
{- |
Module : Text.Pandoc.Writers.JATS.Table
Copyright : © 2020 Albert Krewinkel
@@ -14,69 +16,233 @@ module Text.Pandoc.Writers.JATS.Table
( tableToJATS
) where
import Control.Monad.Reader (asks)
+import Data.List.NonEmpty (NonEmpty ((:|)))
import Data.Text (Text)
+import Text.DocLayout (Doc, empty, vcat, ($$))
import Text.Pandoc.Class.PandocMonad (PandocMonad)
import Text.Pandoc.Definition
import Text.Pandoc.Options (WriterOptions)
-import Text.DocLayout (Doc, empty, vcat, ($$))
import Text.Pandoc.Shared (tshow)
import Text.Pandoc.Writers.JATS.Types
-import Text.Pandoc.Writers.Shared (toLegacyTable)
import Text.Pandoc.XML (inTags, inTagsIndented, selfClosingTag)
-
+import qualified Data.Text as T
+import qualified Text.Pandoc.Writers.AnnotatedTable as Ann
tableToJATS :: PandocMonad m
=> WriterOptions
- -> Attr -> Caption -> [ColSpec] -> TableHead
- -> [TableBody] -> TableFoot
+ -> Ann.Table
-> JATS m (Doc Text)
-tableToJATS opts _attr blkCapt specs th tb tf = do
- blockToJATS <- asks jatsBlockWriter
- let (caption, aligns, widths, headers, rows) =
- toLegacyTable blkCapt specs th tb tf
- captionDoc <- if null caption
- then return mempty
- else inTagsIndented "caption" <$> blockToJATS opts (Para caption)
- tbl <- captionlessTable aligns widths headers rows
+tableToJATS opts (Ann.Table attr caption colspecs thead tbodies tfoot) = do
+ let (Caption _maybeShortCaption captionBlocks) = caption
+ tbl <- captionlessTable opts attr colspecs thead tbodies tfoot
+ captionDoc <- if null captionBlocks
+ then return empty
+ else do
+ blockToJATS <- asks jatsBlockWriter
+ inTagsIndented "caption" . vcat <$>
+ mapM (blockToJATS opts) captionBlocks
return $ inTags True "table-wrap" [] $ captionDoc $$ tbl
+
+captionlessTable :: PandocMonad m
+ => WriterOptions
+ -> Attr
+ -> [ColSpec]
+ -> Ann.TableHead
+ -> [Ann.TableBody]
+ -> Ann.TableFoot
+ -> JATS m (Doc Text)
+captionlessTable opts attr colspecs thead tbodies tfoot = do
+ head' <- tableHeadToJats opts thead
+ bodies <- mapM (tableBodyToJats opts) tbodies
+ foot' <- tableFootToJats opts tfoot
+ let validAttribs = [ "border", "cellpadding", "cellspacing", "content-type"
+ , "frame", "rules", "specific-use", "style", "summary"
+ , "width"
+ ]
+ let attribs = toAttribs attr validAttribs
+ return $ inTags True "table" attribs $ vcat
+ [ colSpecListToJATS colspecs
+ , head'
+ , foot'
+ , vcat bodies
+ ]
+
+validTablePartAttribs :: [Text]
+validTablePartAttribs =
+ [ "align", "char", "charoff", "content-type", "style", "valign" ]
+
+tableBodyToJats :: PandocMonad m
+ => WriterOptions
+ -> Ann.TableBody
+ -> JATS m (Doc Text)
+tableBodyToJats opts (Ann.TableBody attr _rowHeadCols inthead rows) = do
+ let attribs = toAttribs attr validTablePartAttribs
+ intermediateHead <- if null inthead
+ then return mempty
+ else headerRowsToJats opts Thead inthead
+ bodyRows <- bodyRowsToJats opts rows
+ return $ inTags True "tbody" attribs $ intermediateHead $$ bodyRows
+
+tableHeadToJats :: PandocMonad m
+ => WriterOptions
+ -> Ann.TableHead
+ -> JATS m (Doc Text)
+tableHeadToJats opts (Ann.TableHead attr rows) =
+ tablePartToJats opts Thead attr rows
+
+tableFootToJats :: PandocMonad m
+ => WriterOptions
+ -> Ann.TableFoot
+ -> JATS m (Doc Text)
+tableFootToJats opts (Ann.TableFoot attr rows) =
+ tablePartToJats opts Tfoot attr rows
+
+tablePartToJats :: PandocMonad m
+ => WriterOptions
+ -> TablePart
+ -> Attr
+ -> [Ann.HeaderRow]
+ -> JATS m (Doc Text)
+tablePartToJats opts tblpart attr rows =
+ if null rows || all isEmptyRow rows
+ then return mempty
+ else do
+ let tag' = case tblpart of
+ Thead -> "thead"
+ Tfoot -> "tfoot"
+ Tbody -> "tbody" -- this would be unexpected
+ let attribs = toAttribs attr validTablePartAttribs
+ inTags True tag' attribs <$> headerRowsToJats opts tblpart rows
where
- captionlessTable aligns widths headers rows = do
- let percent w = tshow (truncate (100*w) :: Integer) <> "*"
- let coltags = vcat $ zipWith (\w al -> selfClosingTag "col"
- ([("width", percent w) | w > 0] ++
- [("align", alignmentToText al)])) widths aligns
- thead <- if all null headers
- then return empty
- else inTagsIndented "thead" <$> tableRowToJATS opts True headers
- tbody <- inTagsIndented "tbody" . vcat <$>
- mapM (tableRowToJATS opts False) rows
- return $ inTags True "table" [] $ coltags $$ thead $$ tbody
-
-alignmentToText :: Alignment -> Text
-alignmentToText alignment = case alignment of
- AlignLeft -> "left"
- AlignRight -> "right"
- AlignCenter -> "center"
- AlignDefault -> "left"
-
-tableRowToJATS :: PandocMonad m
+ isEmptyRow (Ann.HeaderRow _attr _rownum cells) = all isEmptyCell cells
+ isEmptyCell (Ann.Cell _colspecs _colnum cell) =
+ cell == Cell nullAttr AlignDefault (RowSpan 1) (ColSpan 1) []
+
+-- | The part of a table; header, footer, or body.
+data TablePart = Thead | Tfoot | Tbody
+ deriving (Eq)
+
+data CellType = HeaderCell | BodyCell
+
+data TableRow = TableRow TablePart Attr Ann.RowNumber Ann.RowHead Ann.RowBody
+
+headerRowsToJats :: PandocMonad m
+ => WriterOptions
+ -> TablePart
+ -> [Ann.HeaderRow]
+ -> JATS m (Doc Text)
+headerRowsToJats opts tablepart =
+ rowListToJats opts . map toTableRow
+ where
+ toTableRow (Ann.HeaderRow attr rownum rowbody) =
+ TableRow tablepart attr rownum [] rowbody
+
+bodyRowsToJats :: PandocMonad m
+ => WriterOptions
+ -> [Ann.BodyRow]
+ -> JATS m (Doc Text)
+bodyRowsToJats opts =
+ rowListToJats opts . zipWith toTableRow [1..]
+ where
+ toTableRow rownum (Ann.BodyRow attr _rownum rowhead rowbody) =
+ TableRow Tbody attr rownum rowhead rowbody
+
+rowListToJats :: PandocMonad m
+ => WriterOptions
+ -> [TableRow]
+ -> JATS m (Doc Text)
+rowListToJats opts = fmap vcat . mapM (tableRowToJats opts)
+
+colSpecListToJATS :: [ColSpec] -> Doc Text
+colSpecListToJATS colspecs =
+ let hasDefaultWidth (_, ColWidthDefault) = True
+ hasDefaultWidth _ = False
+
+ percent w = tshow (round (100*w) :: Integer) <> "%"
+
+ col :: ColWidth -> Doc Text
+ col = selfClosingTag "col" . \case
+ ColWidthDefault -> mempty
+ ColWidth w -> [("width", percent w)]
+
+ in if all hasDefaultWidth colspecs
+ then mempty
+ else inTags True "colgroup" [] $ vcat $ map (col . snd) colspecs
+
+tableRowToJats :: PandocMonad m
=> WriterOptions
- -> Bool
- -> [[Block]]
+ -> TableRow
-> JATS m (Doc Text)
-tableRowToJATS opts isHeader cols =
- inTagsIndented "tr" . vcat <$> mapM (tableItemToJATS opts isHeader) cols
+tableRowToJats opts (TableRow tblpart attr _rownum rowhead rowbody) = do
+ let validAttribs = [ "align", "char", "charoff", "content-type"
+ , "style", "valign"
+ ]
+ let attr' = toAttribs attr validAttribs
+ let celltype = case tblpart of
+ Thead -> HeaderCell
+ _ -> BodyCell
+ headcells <- mapM (cellToJats opts HeaderCell) rowhead
+ bodycells <- mapM (cellToJats opts celltype) rowbody
+ return $ inTags True "tr" attr' $ mconcat
+ [ vcat headcells
+ , vcat bodycells
+ ]
+
+alignmentAttrib :: Alignment -> Maybe (Text, Text)
+alignmentAttrib = fmap ("align",) . \case
+ AlignLeft -> Just "left"
+ AlignRight -> Just "right"
+ AlignCenter -> Just "center"
+ AlignDefault -> Nothing
+
+colspanAttrib :: ColSpan -> Maybe (Text, Text)
+colspanAttrib = \case
+ ColSpan 1 -> Nothing
+ ColSpan n -> Just ("colspan", tshow n)
+
+rowspanAttrib :: RowSpan -> Maybe (Text, Text)
+rowspanAttrib = \case
+ RowSpan 1 -> Nothing
+ RowSpan n -> Just ("rowspan", tshow n)
+
+cellToJats :: PandocMonad m
+ => WriterOptions
+ -> CellType
+ -> Ann.Cell
+ -> JATS m (Doc Text)
+cellToJats opts celltype (Ann.Cell (colspec :| _) _colNum cell) =
+ let align = fst colspec
+ in tableCellToJats opts celltype align cell
+
+toAttribs :: Attr -> [Text] -> [(Text, Text)]
+toAttribs (ident, _classes, kvs) knownAttribs =
+ (if T.null ident then id else (("id", ident) :)) $
+ filter ((`elem` knownAttribs) . fst) kvs
-tableItemToJATS :: PandocMonad m
+tableCellToJats :: PandocMonad m
=> WriterOptions
- -> Bool
- -> [Block]
+ -> CellType
+ -> Alignment
+ -> Cell
-> JATS m (Doc Text)
-tableItemToJATS opts isHeader [Plain item] = do
- inlinesToJATS <- asks jatsInlinesWriter
- inTags False (if isHeader then "th" else "td") [] <$>
- inlinesToJATS opts item
-tableItemToJATS opts isHeader item = do
- blockToJATS <- asks jatsBlockWriter
- inTags False (if isHeader then "th" else "td") [] . vcat <$>
- mapM (blockToJATS opts) item
+tableCellToJats opts ctype colAlign (Cell attr align rowspan colspan item) = do
+ blockToJats <- asks jatsBlockWriter
+ inlinesToJats <- asks jatsInlinesWriter
+ let cellContents = \case
+ [Plain inlines] -> inlinesToJats opts inlines
+ blocks -> vcat <$> mapM (blockToJats opts) blocks
+ let tag' = case ctype of
+ BodyCell -> "td"
+ HeaderCell -> "th"
+ let align' = case align of
+ AlignDefault -> colAlign
+ _ -> align
+ let maybeCons = maybe id (:)
+ let validAttribs = [ "abbr", "align", "axis", "char", "charoff"
+ , "content-type", "headers", "scope", "style", "valign"
+ ]
+ let attribs = maybeCons (alignmentAttrib align')
+ . maybeCons (rowspanAttrib rowspan)
+ . maybeCons (colspanAttrib colspan)
+ $ toAttribs attr validAttribs
+ inTags False tag' attribs <$> cellContents item
diff --git a/test/Tests/Old.hs b/test/Tests/Old.hs
index 2eb9e9cb0..aca2d05d0 100644
--- a/test/Tests/Old.hs
+++ b/test/Tests/Old.hs
@@ -101,7 +101,7 @@ tests pandocPath =
, testGroup "jats"
[ testGroup "writer"
[ testGroup "jats_archiving" $
- writerTests' "jats_archiving"
+ extWriterTests' "jats_archiving"
, testGroup "jats_articleauthoring" $
writerTests' "jats_articleauthoring"
, testGroup "jats_publishing" $
diff --git a/test/tables.jats_archiving b/test/tables.jats_archiving
index 30bacc2e8..78d6a79d4 100644
--- a/test/tables.jats_archiving
+++ b/test/tables.jats_archiving
@@ -4,35 +4,31 @@
<p>Demonstration of simple table syntax.</p>
</caption>
<table>
- <col align="right" />
- <col align="left" />
- <col align="center" />
- <col align="left" />
<thead>
<tr>
- <th>Right</th>
- <th>Left</th>
- <th>Center</th>
+ <th align="right">Right</th>
+ <th align="left">Left</th>
+ <th align="center">Center</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr>
- <td>12</td>
- <td>12</td>
- <td>12</td>
+ <td align="right">12</td>
+ <td align="left">12</td>
+ <td align="center">12</td>
<td>12</td>
</tr>
<tr>
- <td>123</td>
- <td>123</td>
- <td>123</td>
+ <td align="right">123</td>
+ <td align="left">123</td>
+ <td align="center">123</td>
<td>123</td>
</tr>
<tr>
- <td>1</td>
- <td>1</td>
- <td>1</td>
+ <td align="right">1</td>
+ <td align="left">1</td>
+ <td align="center">1</td>
<td>1</td>
</tr>
</tbody>
@@ -41,35 +37,31 @@
<p>Simple table without caption:</p>
<table-wrap>
<table>
- <col align="right" />
- <col align="left" />
- <col align="center" />
- <col align="left" />
<thead>
<tr>
- <th>Right</th>
- <th>Left</th>
- <th>Center</th>
+ <th align="right">Right</th>
+ <th align="left">Left</th>
+ <th align="center">Center</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr>
- <td>12</td>
- <td>12</td>
- <td>12</td>
+ <td align="right">12</td>
+ <td align="left">12</td>
+ <td align="center">12</td>
<td>12</td>
</tr>
<tr>
- <td>123</td>
- <td>123</td>
- <td>123</td>
+ <td align="right">123</td>
+ <td align="left">123</td>
+ <td align="center">123</td>
<td>123</td>
</tr>
<tr>
- <td>1</td>
- <td>1</td>
- <td>1</td>
+ <td align="right">1</td>
+ <td align="left">1</td>
+ <td align="center">1</td>
<td>1</td>
</tr>
</tbody>
@@ -81,35 +73,31 @@
<p>Demonstration of simple table syntax.</p>
</caption>
<table>
- <col align="right" />
- <col align="left" />
- <col align="center" />
- <col align="left" />
<thead>
<tr>
- <th>Right</th>
- <th>Left</th>
- <th>Center</th>
+ <th align="right">Right</th>
+ <th align="left">Left</th>
+ <th align="center">Center</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr>
- <td>12</td>
- <td>12</td>
- <td>12</td>
+ <td align="right">12</td>
+ <td align="left">12</td>
+ <td align="center">12</td>
<td>12</td>
</tr>
<tr>
- <td>123</td>
- <td>123</td>
- <td>123</td>
+ <td align="right">123</td>
+ <td align="left">123</td>
+ <td align="center">123</td>
<td>123</td>
</tr>
<tr>
- <td>1</td>
- <td>1</td>
- <td>1</td>
+ <td align="right">1</td>
+ <td align="left">1</td>
+ <td align="center">1</td>
<td>1</td>
</tr>
</tbody>
@@ -121,30 +109,33 @@
<p>Here’s the caption. It may span multiple lines.</p>
</caption>
<table>
- <col width="15*" align="center" />
- <col width="13*" align="left" />
- <col width="16*" align="right" />
- <col width="35*" align="left" />
+ <colgroup>
+ <col width="15%" />
+ <col width="14%" />
+ <col width="16%" />
+ <col width="35%" />
+ </colgroup>
<thead>
<tr>
- <th>Centered Header</th>
- <th>Left Aligned</th>
- <th>Right Aligned</th>
- <th>Default aligned</th>
+ <th align="center">Centered Header</th>
+ <th align="left">Left Aligned</th>
+ <th align="right">Right Aligned</th>
+ <th align="left">Default aligned</th>
</tr>
</thead>
<tbody>
<tr>
- <td>First</td>
- <td>row</td>
- <td>12.0</td>
- <td>Example of a row that spans multiple lines.</td>
+ <td align="center">First</td>
+ <td align="left">row</td>
+ <td align="right">12.0</td>
+ <td align="left">Example of a row that spans multiple lines.</td>
</tr>
<tr>
- <td>Second</td>
- <td>row</td>
- <td>5.0</td>
- <td>Here’s another one. Note the blank line between rows.</td>
+ <td align="center">Second</td>
+ <td align="left">row</td>
+ <td align="right">5.0</td>
+ <td align="left">Here’s another one. Note the blank line between
+ rows.</td>
</tr>
</tbody>
</table>
@@ -152,30 +143,33 @@
<p>Multiline table without caption:</p>
<table-wrap>
<table>
- <col width="15*" align="center" />
- <col width="13*" align="left" />
- <col width="16*" align="right" />
- <col width="35*" align="left" />
+ <colgroup>
+ <col width="15%" />
+ <col width="14%" />
+ <col width="16%" />
+ <col width="35%" />
+ </colgroup>
<thead>
<tr>
- <th>Centered Header</th>
- <th>Left Aligned</th>
- <th>Right Aligned</th>
- <th>Default aligned</th>
+ <th align="center">Centered Header</th>
+ <th align="left">Left Aligned</th>
+ <th align="right">Right Aligned</th>
+ <th align="left">Default aligned</th>
</tr>
</thead>
<tbody>
<tr>
- <td>First</td>
- <td>row</td>
- <td>12.0</td>
- <td>Example of a row that spans multiple lines.</td>
+ <td align="center">First</td>
+ <td align="left">row</td>
+ <td align="right">12.0</td>
+ <td align="left">Example of a row that spans multiple lines.</td>
</tr>
<tr>
- <td>Second</td>
- <td>row</td>
- <td>5.0</td>
- <td>Here’s another one. Note the blank line between rows.</td>
+ <td align="center">Second</td>
+ <td align="left">row</td>
+ <td align="right">5.0</td>
+ <td align="left">Here’s another one. Note the blank line between
+ rows.</td>
</tr>
</tbody>
</table>
@@ -183,28 +177,24 @@
<p>Table without column headers:</p>
<table-wrap>
<table>
- <col align="right" />
- <col align="left" />
- <col align="center" />
- <col align="right" />
<tbody>
<tr>
- <td>12</td>
- <td>12</td>
- <td>12</td>
- <td>12</td>
+ <td align="right">12</td>
+ <td align="left">12</td>
+ <td align="center">12</td>
+ <td align="right">12</td>
</tr>
<tr>
- <td>123</td>
- <td>123</td>
- <td>123</td>
- <td>123</td>
+ <td align="right">123</td>
+ <td align="left">123</td>
+ <td align="center">123</td>
+ <td align="right">123</td>
</tr>
<tr>
- <td>1</td>
- <td>1</td>
- <td>1</td>
- <td>1</td>
+ <td align="right">1</td>
+ <td align="left">1</td>
+ <td align="center">1</td>
+ <td align="right">1</td>
</tr>
</tbody>
</table>
@@ -212,21 +202,23 @@
<p>Multiline table without column headers:</p>
<table-wrap>
<table>
- <col width="15*" align="center" />
- <col width="13*" align="left" />
- <col width="16*" align="right" />
- <col width="35*" align="left" />
+ <colgroup>
+ <col width="15%" />
+ <col width="14%" />
+ <col width="16%" />
+ <col width="35%" />
+ </colgroup>
<tbody>
<tr>
- <td>First</td>
- <td>row</td>
- <td>12.0</td>
+ <td align="center">First</td>
+ <td align="left">row</td>
+ <td align="right">12.0</td>
<td>Example of a row that spans multiple lines.</td>
</tr>
<tr>
- <td>Second</td>
- <td>row</td>
- <td>5.0</td>
+ <td align="center">Second</td>
+ <td align="left">row</td>
+ <td align="right">5.0</td>
<td>Here’s another one. Note the blank line between rows.</td>
</tr>
</tbody>
diff --git a/test/tables.jats_articleauthoring b/test/tables.jats_articleauthoring
index 30bacc2e8..78d6a79d4 100644
--- a/test/tables.jats_articleauthoring
+++ b/test/tables.jats_articleauthoring
@@ -4,35 +4,31 @@
<p>Demonstration of simple table syntax.</p>
</caption>
<table>
- <col align="right" />
- <col align="left" />
- <col align="center" />
- <col align="left" />
<thead>
<tr>
- <th>Right</th>
- <th>Left</th>
- <th>Center</th>
+ <th align="right">Right</th>
+ <th align="left">Left</th>
+ <th align="center">Center</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr>
- <td>12</td>
- <td>12</td>
- <td>12</td>
+ <td align="right">12</td>
+ <td align="left">12</td>
+ <td align="center">12</td>
<td>12</td>
</tr>
<tr>
- <td>123</td>
- <td>123</td>
- <td>123</td>
+ <td align="right">123</td>
+ <td align="left">123</td>
+ <td align="center">123</td>
<td>123</td>
</tr>
<tr>
- <td>1</td>
- <td>1</td>
- <td>1</td>
+ <td align="right">1</td>
+ <td align="left">1</td>
+ <td align="center">1</td>
<td>1</td>
</tr>
</tbody>
@@ -41,35 +37,31 @@
<p>Simple table without caption:</p>
<table-wrap>
<table>
- <col align="right" />
- <col align="left" />
- <col align="center" />
- <col align="left" />
<thead>
<tr>
- <th>Right</th>
- <th>Left</th>
- <th>Center</th>
+ <th align="right">Right</th>
+ <th align="left">Left</th>
+ <th align="center">Center</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr>
- <td>12</td>
- <td>12</td>
- <td>12</td>
+ <td align="right">12</td>
+ <td align="left">12</td>
+ <td align="center">12</td>
<td>12</td>
</tr>
<tr>
- <td>123</td>
- <td>123</td>
- <td>123</td>
+ <td align="right">123</td>
+ <td align="left">123</td>
+ <td align="center">123</td>
<td>123</td>
</tr>
<tr>
- <td>1</td>
- <td>1</td>
- <td>1</td>
+ <td align="right">1</td>
+ <td align="left">1</td>
+ <td align="center">1</td>
<td>1</td>
</tr>
</tbody>
@@ -81,35 +73,31 @@
<p>Demonstration of simple table syntax.</p>
</caption>
<table>
- <col align="right" />
- <col align="left" />
- <col align="center" />
- <col align="left" />
<thead>
<tr>
- <th>Right</th>
- <th>Left</th>
- <th>Center</th>
+ <th align="right">Right</th>
+ <th align="left">Left</th>
+ <th align="center">Center</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr>
- <td>12</td>
- <td>12</td>
- <td>12</td>
+ <td align="right">12</td>
+ <td align="left">12</td>
+ <td align="center">12</td>
<td>12</td>
</tr>
<tr>
- <td>123</td>
- <td>123</td>
- <td>123</td>
+ <td align="right">123</td>
+ <td align="left">123</td>
+ <td align="center">123</td>
<td>123</td>
</tr>
<tr>
- <td>1</td>
- <td>1</td>
- <td>1</td>
+ <td align="right">1</td>
+ <td align="left">1</td>
+ <td align="center">1</td>
<td>1</td>
</tr>
</tbody>
@@ -121,30 +109,33 @@
<p>Here’s the caption. It may span multiple lines.</p>
</caption>
<table>
- <col width="15*" align="center" />
- <col width="13*" align="left" />
- <col width="16*" align="right" />
- <col width="35*" align="left" />
+ <colgroup>
+ <col width="15%" />
+ <col width="14%" />
+ <col width="16%" />
+ <col width="35%" />
+ </colgroup>
<thead>
<tr>
- <th>Centered Header</th>
- <th>Left Aligned</th>
- <th>Right Aligned</th>
- <th>Default aligned</th>
+ <th align="center">Centered Header</th>
+ <th align="left">Left Aligned</th>
+ <th align="right">Right Aligned</th>
+ <th align="left">Default aligned</th>
</tr>
</thead>
<tbody>
<tr>
- <td>First</td>
- <td>row</td>
- <td>12.0</td>
- <td>Example of a row that spans multiple lines.</td>
+ <td align="center">First</td>
+ <td align="left">row</td>
+ <td align="right">12.0</td>
+ <td align="left">Example of a row that spans multiple lines.</td>
</tr>
<tr>
- <td>Second</td>
- <td>row</td>
- <td>5.0</td>
- <td>Here’s another one. Note the blank line between rows.</td>
+ <td align="center">Second</td>
+ <td align="left">row</td>
+ <td align="right">5.0</td>
+ <td align="left">Here’s another one. Note the blank line between
+ rows.</td>
</tr>
</tbody>
</table>
@@ -152,30 +143,33 @@
<p>Multiline table without caption:</p>
<table-wrap>
<table>
- <col width="15*" align="center" />
- <col width="13*" align="left" />
- <col width="16*" align="right" />
- <col width="35*" align="left" />
+ <colgroup>
+ <col width="15%" />
+ <col width="14%" />
+ <col width="16%" />
+ <col width="35%" />
+ </colgroup>
<thead>
<tr>
- <th>Centered Header</th>
- <th>Left Aligned</th>
- <th>Right Aligned</th>
- <th>Default aligned</th>
+ <th align="center">Centered Header</th>
+ <th align="left">Left Aligned</th>
+ <th align="right">Right Aligned</th>
+ <th align="left">Default aligned</th>
</tr>
</thead>
<tbody>
<tr>
- <td>First</td>
- <td>row</td>
- <td>12.0</td>
- <td>Example of a row that spans multiple lines.</td>
+ <td align="center">First</td>
+ <td align="left">row</td>
+ <td align="right">12.0</td>
+ <td align="left">Example of a row that spans multiple lines.</td>
</tr>
<tr>
- <td>Second</td>
- <td>row</td>
- <td>5.0</td>
- <td>Here’s another one. Note the blank line between rows.</td>
+ <td align="center">Second</td>
+ <td align="left">row</td>
+ <td align="right">5.0</td>
+ <td align="left">Here’s another one. Note the blank line between
+ rows.</td>
</tr>
</tbody>
</table>
@@ -183,28 +177,24 @@
<p>Table without column headers:</p>
<table-wrap>
<table>
- <col align="right" />
- <col align="left" />
- <col align="center" />
- <col align="right" />
<tbody>
<tr>
- <td>12</td>
- <td>12</td>
- <td>12</td>
- <td>12</td>
+ <td align="right">12</td>
+ <td align="left">12</td>
+ <td align="center">12</td>
+ <td align="right">12</td>
</tr>
<tr>
- <td>123</td>
- <td>123</td>
- <td>123</td>
- <td>123</td>
+ <td align="right">123</td>
+ <td align="left">123</td>
+ <td align="center">123</td>
+ <td align="right">123</td>
</tr>
<tr>
- <td>1</td>
- <td>1</td>
- <td>1</td>
- <td>1</td>
+ <td align="right">1</td>
+ <td align="left">1</td>
+ <td align="center">1</td>
+ <td align="right">1</td>
</tr>
</tbody>
</table>
@@ -212,21 +202,23 @@
<p>Multiline table without column headers:</p>
<table-wrap>
<table>
- <col width="15*" align="center" />
- <col width="13*" align="left" />
- <col width="16*" align="right" />
- <col width="35*" align="left" />
+ <colgroup>
+ <col width="15%" />
+ <col width="14%" />
+ <col width="16%" />
+ <col width="35%" />
+ </colgroup>
<tbody>
<tr>
- <td>First</td>
- <td>row</td>
- <td>12.0</td>
+ <td align="center">First</td>
+ <td align="left">row</td>
+ <td align="right">12.0</td>
<td>Example of a row that spans multiple lines.</td>
</tr>
<tr>
- <td>Second</td>
- <td>row</td>
- <td>5.0</td>
+ <td align="center">Second</td>
+ <td align="left">row</td>
+ <td align="right">5.0</td>
<td>Here’s another one. Note the blank line between rows.</td>
</tr>
</tbody>
diff --git a/test/tables.jats_publishing b/test/tables.jats_publishing
index 30bacc2e8..78d6a79d4 100644
--- a/test/tables.jats_publishing
+++ b/test/tables.jats_publishing
@@ -4,35 +4,31 @@
<p>Demonstration of simple table syntax.</p>
</caption>
<table>
- <col align="right" />
- <col align="left" />
- <col align="center" />
- <col align="left" />
<thead>
<tr>
- <th>Right</th>
- <th>Left</th>
- <th>Center</th>
+ <th align="right">Right</th>
+ <th align="left">Left</th>
+ <th align="center">Center</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr>
- <td>12</td>
- <td>12</td>
- <td>12</td>
+ <td align="right">12</td>
+ <td align="left">12</td>
+ <td align="center">12</td>
<td>12</td>
</tr>
<tr>
- <td>123</td>
- <td>123</td>
- <td>123</td>
+ <td align="right">123</td>
+ <td align="left">123</td>
+ <td align="center">123</td>
<td>123</td>
</tr>
<tr>
- <td>1</td>
- <td>1</td>
- <td>1</td>
+ <td align="right">1</td>
+ <td align="left">1</td>
+ <td align="center">1</td>
<td>1</td>
</tr>
</tbody>
@@ -41,35 +37,31 @@
<p>Simple table without caption:</p>
<table-wrap>
<table>
- <col align="right" />
- <col align="left" />
- <col align="center" />
- <col align="left" />
<thead>
<tr>
- <th>Right</th>
- <th>Left</th>
- <th>Center</th>
+ <th align="right">Right</th>
+ <th align="left">Left</th>
+ <th align="center">Center</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr>
- <td>12</td>
- <td>12</td>
- <td>12</td>
+ <td align="right">12</td>
+ <td align="left">12</td>
+ <td align="center">12</td>
<td>12</td>
</tr>
<tr>
- <td>123</td>
- <td>123</td>
- <td>123</td>
+ <td align="right">123</td>
+ <td align="left">123</td>
+ <td align="center">123</td>
<td>123</td>
</tr>
<tr>
- <td>1</td>
- <td>1</td>
- <td>1</td>
+ <td align="right">1</td>
+ <td align="left">1</td>
+ <td align="center">1</td>
<td>1</td>
</tr>
</tbody>
@@ -81,35 +73,31 @@
<p>Demonstration of simple table syntax.</p>
</caption>
<table>
- <col align="right" />
- <col align="left" />
- <col align="center" />
- <col align="left" />
<thead>
<tr>
- <th>Right</th>
- <th>Left</th>
- <th>Center</th>
+ <th align="right">Right</th>
+ <th align="left">Left</th>
+ <th align="center">Center</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr>
- <td>12</td>
- <td>12</td>
- <td>12</td>
+ <td align="right">12</td>
+ <td align="left">12</td>
+ <td align="center">12</td>
<td>12</td>
</tr>
<tr>
- <td>123</td>
- <td>123</td>
- <td>123</td>
+ <td align="right">123</td>
+ <td align="left">123</td>
+ <td align="center">123</td>
<td>123</td>
</tr>
<tr>
- <td>1</td>
- <td>1</td>
- <td>1</td>
+ <td align="right">1</td>
+ <td align="left">1</td>
+ <td align="center">1</td>
<td>1</td>
</tr>
</tbody>
@@ -121,30 +109,33 @@
<p>Here’s the caption. It may span multiple lines.</p>
</caption>
<table>
- <col width="15*" align="center" />
- <col width="13*" align="left" />
- <col width="16*" align="right" />
- <col width="35*" align="left" />
+ <colgroup>
+ <col width="15%" />
+ <col width="14%" />
+ <col width="16%" />
+ <col width="35%" />
+ </colgroup>
<thead>
<tr>
- <th>Centered Header</th>
- <th>Left Aligned</th>
- <th>Right Aligned</th>
- <th>Default aligned</th>
+ <th align="center">Centered Header</th>
+ <th align="left">Left Aligned</th>
+ <th align="right">Right Aligned</th>
+ <th align="left">Default aligned</th>
</tr>
</thead>
<tbody>
<tr>
- <td>First</td>
- <td>row</td>
- <td>12.0</td>
- <td>Example of a row that spans multiple lines.</td>
+ <td align="center">First</td>
+ <td align="left">row</td>
+ <td align="right">12.0</td>
+ <td align="left">Example of a row that spans multiple lines.</td>
</tr>
<tr>
- <td>Second</td>
- <td>row</td>
- <td>5.0</td>
- <td>Here’s another one. Note the blank line between rows.</td>
+ <td align="center">Second</td>
+ <td align="left">row</td>
+ <td align="right">5.0</td>
+ <td align="left">Here’s another one. Note the blank line between
+ rows.</td>
</tr>
</tbody>
</table>
@@ -152,30 +143,33 @@
<p>Multiline table without caption:</p>
<table-wrap>
<table>
- <col width="15*" align="center" />
- <col width="13*" align="left" />
- <col width="16*" align="right" />
- <col width="35*" align="left" />
+ <colgroup>
+ <col width="15%" />
+ <col width="14%" />
+ <col width="16%" />
+ <col width="35%" />
+ </colgroup>
<thead>
<tr>
- <th>Centered Header</th>
- <th>Left Aligned</th>
- <th>Right Aligned</th>
- <th>Default aligned</th>
+ <th align="center">Centered Header</th>
+ <th align="left">Left Aligned</th>
+ <th align="right">Right Aligned</th>
+ <th align="left">Default aligned</th>
</tr>
</thead>
<tbody>
<tr>
- <td>First</td>
- <td>row</td>
- <td>12.0</td>
- <td>Example of a row that spans multiple lines.</td>
+ <td align="center">First</td>
+ <td align="left">row</td>
+ <td align="right">12.0</td>
+ <td align="left">Example of a row that spans multiple lines.</td>
</tr>
<tr>
- <td>Second</td>
- <td>row</td>
- <td>5.0</td>
- <td>Here’s another one. Note the blank line between rows.</td>
+ <td align="center">Second</td>
+ <td align="left">row</td>
+ <td align="right">5.0</td>
+ <td align="left">Here’s another one. Note the blank line between
+ rows.</td>
</tr>
</tbody>
</table>
@@ -183,28 +177,24 @@
<p>Table without column headers:</p>
<table-wrap>
<table>
- <col align="right" />
- <col align="left" />
- <col align="center" />
- <col align="right" />
<tbody>
<tr>
- <td>12</td>
- <td>12</td>
- <td>12</td>
- <td>12</td>
+ <td align="right">12</td>
+ <td align="left">12</td>
+ <td align="center">12</td>
+ <td align="right">12</td>
</tr>
<tr>
- <td>123</td>
- <td>123</td>
- <td>123</td>
- <td>123</td>
+ <td align="right">123</td>
+ <td align="left">123</td>
+ <td align="center">123</td>
+ <td align="right">123</td>
</tr>
<tr>
- <td>1</td>
- <td>1</td>
- <td>1</td>
- <td>1</td>
+ <td align="right">1</td>
+ <td align="left">1</td>
+ <td align="center">1</td>
+ <td align="right">1</td>
</tr>
</tbody>
</table>
@@ -212,21 +202,23 @@
<p>Multiline table without column headers:</p>
<table-wrap>
<table>
- <col width="15*" align="center" />
- <col width="13*" align="left" />
- <col width="16*" align="right" />
- <col width="35*" align="left" />
+ <colgroup>
+ <col width="15%" />
+ <col width="14%" />
+ <col width="16%" />
+ <col width="35%" />
+ </colgroup>
<tbody>
<tr>
- <td>First</td>
- <td>row</td>
- <td>12.0</td>
+ <td align="center">First</td>
+ <td align="left">row</td>
+ <td align="right">12.0</td>
<td>Example of a row that spans multiple lines.</td>
</tr>
<tr>
- <td>Second</td>
- <td>row</td>
- <td>5.0</td>
+ <td align="center">Second</td>
+ <td align="left">row</td>
+ <td align="right">5.0</td>
<td>Here’s another one. Note the blank line between rows.</td>
</tr>
</tbody>
diff --git a/test/tables/nordics.jats_archiving b/test/tables/nordics.jats_archiving
new file mode 100644
index 000000000..5ac78bacd
--- /dev/null
+++ b/test/tables/nordics.jats_archiving
@@ -0,0 +1,58 @@
+<table-wrap>
+ <caption>
+ <p>States belonging to the <italic>Nordics.</italic></p>
+ </caption>
+ <table id="nordics">
+ <colgroup>
+ <col width="30%" />
+ <col width="30%" />
+ <col width="20%" />
+ <col width="20%" />
+ </colgroup>
+ <thead>
+ <tr>
+ <th align="center">Name</th>
+ <th align="center">Capital</th>
+ <th align="center">Population
+ (in 2018)</th>
+ <th align="center">Area
+ (in km<sup>2</sup>)</th>
+ </tr>
+ </thead>
+ <tfoot>
+ <tr id="summary">
+ <td align="center">Total</td>
+ <td align="left"></td>
+ <td align="left" id="total-population">27,376,022</td>
+ <td align="left" id="total-area">1,258,336</td>
+ </tr>
+ </tfoot>
+ <tbody>
+ <tr>
+ <th align="center">Denmark</th><td align="left">Copenhagen</td>
+ <td align="left">5,809,502</td>
+ <td align="left">43,094</td>
+ </tr>
+ <tr>
+ <th align="center">Finland</th><td align="left">Helsinki</td>
+ <td align="left">5,537,364</td>
+ <td align="left">338,145</td>
+ </tr>
+ <tr>
+ <th align="center">Iceland</th><td align="left">Reykjavik</td>
+ <td align="left">343,518</td>
+ <td align="left">103,000</td>
+ </tr>
+ <tr>
+ <th align="center">Norway</th><td align="left">Oslo</td>
+ <td align="left">5,372,191</td>
+ <td align="left">323,802</td>
+ </tr>
+ <tr>
+ <th align="center">Sweden</th><td align="left">Stockholm</td>
+ <td align="left">10,313,447</td>
+ <td align="left">450,295</td>
+ </tr>
+ </tbody>
+ </table>
+</table-wrap>
diff --git a/test/tables/planets.jats_archiving b/test/tables/planets.jats_archiving
new file mode 100644
index 000000000..e0158b6fa
--- /dev/null
+++ b/test/tables/planets.jats_archiving
@@ -0,0 +1,128 @@
+<table-wrap>
+ <caption>
+ <p>Data about the planets of our solar system.</p>
+ </caption>
+ <table>
+ <thead>
+ <tr>
+ <th align="center" colspan="2"></th>
+ <th>Name</th>
+ <th align="right">Mass (10^24kg)</th>
+ <th align="right">Diameter (km)</th>
+ <th align="right">Density (kg/m^3)</th>
+ <th align="right">Gravity (m/s^2)</th>
+ <th align="right">Length of day (hours)</th>
+ <th align="right">Distance from Sun (10^6km)</th>
+ <th align="right">Mean temperature (C)</th>
+ <th align="right">Number of moons</th>
+ <th>Notes</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <th align="center" rowspan="4" colspan="2">Terrestrial planets</th>
+ <th>Mercury</th><td align="right">0.330</td>
+ <td align="right">4,879</td>
+ <td align="right">5427</td>
+ <td align="right">3.7</td>
+ <td align="right">4222.6</td>
+ <td align="right">57.9</td>
+ <td align="right">167</td>
+ <td align="right">0</td>
+ <td>Closest to the Sun</td>
+ </tr>
+ <tr>
+ <th>Venus</th><td align="right">4.87</td>
+ <td align="right">12,104</td>
+ <td align="right">5243</td>
+ <td align="right">8.9</td>
+ <td align="right">2802.0</td>
+ <td align="right">108.2</td>
+ <td align="right">464</td>
+ <td align="right">0</td>
+ <td></td>
+ </tr>
+ <tr>
+ <th>Earth</th><td align="right">5.97</td>
+ <td align="right">12,756</td>
+ <td align="right">5514</td>
+ <td align="right">9.8</td>
+ <td align="right">24.0</td>
+ <td align="right">149.6</td>
+ <td align="right">15</td>
+ <td align="right">1</td>
+ <td>Our world</td>
+ </tr>
+ <tr>
+ <th>Mars</th><td align="right">0.642</td>
+ <td align="right">6,792</td>
+ <td align="right">3933</td>
+ <td align="right">3.7</td>
+ <td align="right">24.7</td>
+ <td align="right">227.9</td>
+ <td align="right">-65</td>
+ <td align="right">2</td>
+ <td>The red planet</td>
+ </tr>
+ <tr>
+ <th align="center" rowspan="4">Jovian planets</th>
+ <th align="center" rowspan="2">Gas giants</th>
+ <th>Jupiter</th><td align="right">1898</td>
+ <td align="right">142,984</td>
+ <td align="right">1326</td>
+ <td align="right">23.1</td>
+ <td align="right">9.9</td>
+ <td align="right">778.6</td>
+ <td align="right">-110</td>
+ <td align="right">67</td>
+ <td>The largest planet</td>
+ </tr>
+ <tr>
+ <th>Saturn</th><td align="right">568</td>
+ <td align="right">120,536</td>
+ <td align="right">687</td>
+ <td align="right">9.0</td>
+ <td align="right">10.7</td>
+ <td align="right">1433.5</td>
+ <td align="right">-140</td>
+ <td align="right">62</td>
+ <td></td>
+ </tr>
+ <tr>
+ <th align="center" rowspan="2">Ice giants</th>
+ <th>Uranus</th><td align="right">86.8</td>
+ <td align="right">51,118</td>
+ <td align="right">1271</td>
+ <td align="right">8.7</td>
+ <td align="right">17.2</td>
+ <td align="right">2872.5</td>
+ <td align="right">-195</td>
+ <td align="right">27</td>
+ <td></td>
+ </tr>
+ <tr>
+ <th>Neptune</th><td align="right">102</td>
+ <td align="right">49,528</td>
+ <td align="right">1638</td>
+ <td align="right">11.0</td>
+ <td align="right">16.1</td>
+ <td align="right">4495.1</td>
+ <td align="right">-200</td>
+ <td align="right">14</td>
+ <td></td>
+ </tr>
+ <tr>
+ <th align="center" colspan="2">Dwarf planets</th>
+ <th>Pluto</th><td align="right">0.0146</td>
+ <td align="right">2,370</td>
+ <td align="right">2095</td>
+ <td align="right">0.7</td>
+ <td align="right">153.3</td>
+ <td align="right">5906.4</td>
+ <td align="right">-225</td>
+ <td align="right">5</td>
+ <td>Declassified as a planet in 2006.</td>
+ </tr>
+ </tbody>
+ </table>
+</table-wrap>
diff --git a/test/tables/students.jats_archiving b/test/tables/students.jats_archiving
new file mode 100644
index 000000000..3edf58a7f
--- /dev/null
+++ b/test/tables/students.jats_archiving
@@ -0,0 +1,56 @@
+<table-wrap>
+ <caption>
+ <p>List of Students</p>
+ </caption>
+ <table id="students">
+ <colgroup>
+ <col width="50%" />
+ <col width="50%" />
+ </colgroup>
+ <thead>
+ <tr>
+ <th align="center">Student ID</th>
+ <th align="center">Name</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <th align="left" colspan="2">Computer Science</th>
+ </tr>
+ <tr>
+ <td align="left">3741255</td>
+ <td align="left">Jones, Martha</td>
+ </tr>
+ <tr>
+ <td align="left">4077830</td>
+ <td align="left">Pierce, Benjamin</td>
+ </tr>
+ <tr>
+ <td align="left">5151701</td>
+ <td align="left">Kirk, James</td>
+ </tr>
+ </tbody>
+ <tbody>
+ <tr>
+ <th align="left" colspan="2">Russian Literature</th>
+ </tr>
+ <tr>
+ <td align="left">3971244</td>
+ <td align="left">Nim, Victor</td>
+ </tr>
+ </tbody>
+ <tbody>
+ <tr>
+ <th align="left" colspan="2">Astrophysics</th>
+ </tr>
+ <tr>
+ <td align="left">4100332</td>
+ <td align="left">Petrov, Alexandra</td>
+ </tr>
+ <tr>
+ <td align="left">4100332</td>
+ <td align="left">Toyota, Hiroko</td>
+ </tr>
+ </tbody>
+ </table>
+</table-wrap>