我尝试将上下文的 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}{}