ConTeXt:如何在lua中使用xmlflush?

ConTeXt:如何在lua中使用xmlflush?

我尝试将上下文的 xml 与这个 xhtml 文件一起使用。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<body>
  <q>Some quote with <em>italic</em> and a nested <q>quote</q></q>
</body>
</html>

使用此环境文件

\startxmlsetups xml:setup
    \xmlsetsetup{\xmldocument}{*}{-}
    \xmlsetsetup{\xmldocument}{html|body|q|em}{xml:*}
\stopxmlsetups

\xmlregistersetup{xml:setup}

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

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

\startxmlsetups xml:q
    \quotation{\xmlflush{#1}}
    %\xmlfunction{#1}{q}
\stopxmlsetups
\startluacode
    function xml.functions.q(t)
        context.quotation(lxml.flush(t)) --does not work
    end
\stopluacode

\definebodyfontenvironment[default][em=italic]
\startxmlsetups xml:em
    \dontleavehmode{\em \xmlflush{#1}}
\stopxmlsetups

如果我使用 TeX 版本,它就可以工作。如果我切换到 lua 函数,它就不再起作用了。lua 的等价物是什么\quotation{\xmlflush{#1}}

答案1

首先,由于没有返回值,context.quotation(lxml.flush(t))所以无法工作。为什么会这样以及后果是什么,下面将进行讨论。lxml.flush

您遇到了 LuaTeX 的先有鸡蛋问题。根本问题是 Lua 后端代码和排版输出哪个先出现。

LuaTeX 设计者决定,Lua 后端代码优先。因此,无法访问使用tex.sprint同一 Lua 块排版的文本(这是lxml.flush幕后的工作)。您必须先将其交还给 TeX 端,然后再进行处理。在这种情况下,解决方案是简单地执行\quotation{\xmlfunction{#1}{q}}

仔细观察,我们意识到当我们调用函数时,quotation参数会被求值函数被调用。这意味着这在 even 开始lxml.flush(t)之前就发生了quotation,并且输出已经交还给 TeX。这就是为什么我们需要使用 lambda 函数来推迟求值。

function xml.functions.q(t)
    context.quotation(function() lxml.flush(t) end)
end

您可以在ConTeXt Lua 文档手册

\startbuffer[test]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<body>
  <q>Some quote with <em>italic</em> and a nested <q>quote</q></q>
</body>
</html>
\stopbuffer

\startxmlsetups xml:setup
  \xmlsetsetup{\xmldocument}{*}{-}
  \xmlsetsetup{\xmldocument}{html|body|q|em}{xml:*}
\stopxmlsetups

\xmlregistersetup{xml:setup}

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

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

\startxmlsetups xml:q
  \xmlfunction{#1}{q}
\stopxmlsetups
\startluacode
function xml.functions.q(t)
    context.quotation(function() lxml.flush(t) end)
end
\stopluacode

\definebodyfontenvironment[default][em=italic]
\startxmlsetups xml:em
  \dontleavehmode{\em \xmlflush{#1}}
\stopxmlsetups

\xmlprocessbuffer{test}{test}{}

相关内容