如何在ConTeXt中显示经过Lua处理的特殊符号?

如何在ConTeXt中显示经过Lua处理的特殊符号?

我有一个包含许多特殊字符的 ConTeXt 文档。我已按照以下说明进行操作ConTeXt 中哪些符号需要转义?以确保它们都能在文档中正常显示,但是由于我的大部分文本都是通过Lua处理的,因此我发现了一些问题。当\#文档中出现 时,因为我想显示符号“#”,Lua无法编译。还有,当文档中出现双引号时,例如",Lua无法编译。

  • 当与 Lua 一起使用时,如何让这些符号显示在 ConTeXt 中?
  • 与 Lua 一起使用时还有哪些特殊字符需要特殊处理?

更新:

以下是一些示例代码:

\define[2]\showtext{%
    \startlua
        if #1 < 2 then
            context("#2")
        end
    \stoplua%
}

\starttext
    \showtext{1}{This is text \#1.}
\stoptext

答案1

正如@rdhs在他的评论中提到的,你可以使用[[...]]Lua字符串。ConTeXt提供了\!!bs ... \!!es映射到的宏[===[ ... ]===](这样你的字符串[[也可以有文字)。因此,定义这种宏的最简单方法是:

\unprotect
\define[2]\showtext
  {\startlua
        if #1 < 2 then
            context(\!!bs#2\!!es)
        end
    \stoplua}
\protect

另一种选择是使用一系列 Lua 函数,它们遵循与一系列 ConTeXt 宏commands.doif相同的语法:\doif

\define[1]\showtext{\ctxcommand{doif(#1 < 2)}}

后者的优点是速度稍快(#2不扫描)且更强大,例如,

\showtext {5}{\undefined}

与第二个定义兼容,但与第一个定义不兼容。

答案2

这里至少有两种方法,但都与 TeX 和 Lua 在类别代码方面的交互方式有关(参见LuaTeX 中的 Lua 部分可以了解标记吗?有关更多信息)。发生的情况是,当 TeX 将输入传输到 Lua 时,\#会转义#,但当 Lua 将结果传输回 TeX 时,您只得到了#类别代码 6。

第一个解决方案是在输入中包含一个附加项\,该附加项本身需要转义

\define[2]\showtext{%
    \startlua
        if #1 < 2 then
            context("#2")
        end
    \stoplua%
}
\starttext
    \showtext{1}{This is text \\\#1.}
\stoptext

这意味着 Lua 接收来自 TeX 的输入This is text \#1.,该输入具有正常的类别代码,并会按照您的需要由 TeX 进行解析。

另一种方法是使用可选参数故意转换为具有安全类别代码的 TeX tex.print

\define[2]\showtext{%
    \startlua
        if #1 < 2 then
            tex.print(-2, "#2")
        end
    \stoplua%
}
\starttext
    \showtext{1}{This is text \#1.}
\stoptext

它作为可选参数,用于tex.print设置用于将标记传输回 TeX 的类别代码表,并且表-2是“去标记化”表。

哪种解决方案最合适取决于您的用例。例如,如果您希望其他 TeX 类别代码应用于输入(例如可以存在受保护的宏),那么第一个是最好的,但如果您只想要文本,那么第二个更好,因为它可以让 TeX 输入更清晰。

相关内容