背景

背景

背景

XML 文档包含内联和段落形式的 TeX 元素:

<p>Inline: <tex>$E=mc^3$</tex></p>
<p><tex>$$E=mc^2$$</tex></p>

我想有条件地使用位置公式$$在启动元素时使用交叉引用<tex>

系统

ConTeXt 版本:2023.09.26 18:19

问题

我尝试提取第一个字符的所有方法都以编译失败告终。

代码

这是基本设置:

\startxmlsetups xml:tex
  \xmlflushcontext{#1}
\stopxmlsetups

这可以生成文档,但显然不需要交叉引用。以下是获取前导字符的一些尝试(全部失败):

\getfirstcharacter{\xmltext{#1}{.}}
\firstcharacter
% ...

\getfirstcharacter{\expanded{\xmlverbatim{#1}}}
\firstcharacter
% ...

\getfirstcharacter{\xmlflush{#1}}
\firstcharacter
% ...

\thefirstcharacter{\xmlflush{#1}}
\firstcharacter
% ...

\setvariable{Reference}{xml}{\xmlflush{#1}}
\getvariable{Reference}{xml}

\doiffirstcharelse{\xmlflush{#1}}{\textdollar}{DOLLAR}{NO DOLLAR}
\doiffirstcharelse{\xmltext{#1}}{\textdollar}{DOLLAR}{NO DOLLAR}

以及其众多变体。使用doiffirstcharelse不起作用,因为我需要检查前两个字符(或子字符串),但可以传达这个想法。

问题

如何提取 XMLtex元素的内容并检查双美元符号以有条件地应用单独的命令?

答案1

\doifinstringelse结合起来\getsubstring似乎有效:

\startbuffer[main]
<body>
    <p>Inline: <tex>$E=mc^3$</tex></p>
    <p><tex>$$E=mc^2$$</tex></p>
</body>
\stopbuffer

\startxmlsetups xml:root
    \xmlsetsetup{\xmldocument}{*}{xml:*}
\stopxmlsetups

\xmlregistersetup{xml:root}

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

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

\startxmlsetups xml:tex
    \doifinstringelse%
        {$$}% Pattern
        {\getsubstring{1}{2}{\xmlflushcontext{#1}}}% Text
        {True}% True code
        {False}% False code

    \xmlflushcontext{#1}
\stopxmlsetups

\startTEXpage[offset=1dk, width=3in, align=middle]
    \xmlprocessbuffer{main}{main}{}
\stopTEXpage

输出

我通过搜索“string”找到了这些命令命令参考手册

相关内容