我有一个包含许多特殊字符的 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 输入更清晰。