ConTeXt XML:嵌套部分元素

ConTeXt XML:嵌套部分元素

我正在尝试使用 ConTeXt 从 XML 生成 PDF。目前,我正在努力解决这个问题:XML 文件在 JATS 中,而 JATS 通常不指定节的级别。有一个可选属性disp-level我到现在都在使用,但事实证明这个属性经常被省略。这意味着我必须猜测我们处于哪个节级别。为了做到这一点,我尝试检查我们距离有多远<body>:如果它<body>是当前元素的父元素,则当前元素的级别为section,如果它是当前元素的父元素的父元素,subsection则当前元素的级别为,依此类推。

\startbuffer[test]
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Publishing DTD v1.0 20120330//EN"
                  "JATS-journalpublishing1.dtd">
<article xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink" dtd-version="1.0" article-type="other">
<front>
</front>
<body>
<sec id="section-heading">
  <title>Section Heading</title>
  <p>Some Text</p>
  <sec id="subsection-heading">
    <title>Subsection Heading</title>
    <p>More Text</p>
  </sec>
</sec>
</body>
<back>
</back>
</article>
\stopbuffer

\startxmlsetups xml:jatssetups
    \xmlsetsetup{#1}{*}{-}
    \xmlsetsetup{#1}{article|body|sec|p}{xml:*}
\stopxmlsetups

\xmlregistersetup{xml:jatssetups}

\startxmlsetups xml:article
    \xmlflush{#1}
\stopxmlsetups

\startxmlsetups xml:body
    \startdocument
    \xmlflush{#1}
    \stopdocument
\stopxmlsetups

\startxmlsetups xml:p
    \xmlflush{#1}\par
\stopxmlsetups

% Sections

\startxmlsetups xml:sec
    \xmlfilter{#1}{../../body/command(xml:sec:section)} 
\stopxmlsetups

\startxmlsetups xml:sec:section
    \startsection[title=\xmlfirst{#1}{/title}]
      \xmlall{#1}{/!title}
    \stopsection
\stopxmlsetups

\startxmlsetups xml:sec:subsection
    \startsubsection[title=\xmlfirst{#1}{/title}]
      \xmlall{#1}{/!title}
    \stopsubsection
\stopxmlsetups


\xmlprocessbuffer{main}{test}{}

但是,这会产生致命错误(“TeX 容量超出。”)。也许有人有更好的主意?

答案1

一种选择是将<section>标签映射到\startsectionlevel可以嵌套的宏:

\starttext
\startstructurelevel[title=Section heading]
  Some text
  \startstructurelevel[title=Subsection heading]
    More text
  \stopstructurelevel
\stopstructurelevel
\stoptext

默认映射是第一级映射到章节,第二级映射到节,依此类推。您可以使用以下方法更改此设置:

\definesectionlevels
  [default]
  [
    section,
    subsection,
    subsubsection,
    subsubsubsection,
  ] 

通过上述设置,第一级\startstructurelevel映射到\startsection,第二级\startstructurelevel映射到\startsubsection,依此类推,直到四级嵌套。

您可以使用常规设置命令来更改文档的样式,这些命令可以更改文档的样式\startsection等。以下是示例:

\definesectionlevels
  [default]
  [
    section,
    subsection,
    subsubsection,
    subsubsubsection,
  ] 

\setuphead[section][color=blue]
\setuphead[subsection][color=red]

\starttext
\startstructurelevel[title=Section heading]
  Some text
  \startstructurelevel[title=Subsection heading]
    More text
  \stopstructurelevel
\stopstructurelevel
\stoptext

这使

在此处输入图片描述

答案2

根据 Aditya 的意见,我现在可以提出这个解决方案:

\startbuffer[test]
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Publishing DTD v1.0 20120330//EN"
                  "JATS-journalpublishing1.dtd">
<article xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink" dtd-version="1.0" article-type="other">
<front>
</front>
<body>
<sec id="section-heading">
  <title>Section Heading</title>
  <p>Some Text</p>
  <sec id="subsection-heading">
    <title>Subsection Heading</title>
    <p>More Text</p>
  </sec>
</sec>
</body>
<back>
</back>
</article>
\stopbuffer

\startxmlsetups xml:jatssetups
    \xmlsetsetup{#1}{*}{-}
    \xmlsetsetup{#1}{article|body|sec|p}{xml:*}
\stopxmlsetups

\xmlregistersetup{xml:jatssetups}

\startxmlsetups xml:article
    \xmlflush{#1}
\stopxmlsetups

\startxmlsetups xml:body
    \startdocument
    \xmlflush{#1}
    \stopdocument
\stopxmlsetups

\startxmlsetups xml:p
    \xmlflush{#1}\par
\stopxmlsetups

% Sections

\startxmlsetups xml:sec
    \startstructurelevel [title=\xmlfilter{#1}{/title/command(xml:sec:title)}]
     \xmlflush{#1}
    \stopstructurelevel
\stopxmlsetups

\startxmlsetups xml:sec:title
    \xmlflush{#1}
\stopxmlsetups

\definestructurelevels [default] [section,subsection,subsubsection]
\setuphead [section] [style=\bf]
\setuphead [subsection] [style=\em]


\xmlprocessbuffer{main}{test}{}

相关内容