背景
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”找到了这些命令命令参考手册。