我正在尝试使用 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}{}