使用 ConTeXt 时突出显示代码的最佳方法是什么?我知道它支持特定语言,如ConTeXt 维基,但目前看来功能相当有限。我知道我们也可以通过t-vim
模块依赖 vim。
现在,我想知道是否存在更自动化的方法来处理其他语言,如 R、Python、Lisp、Asymptote?此外,我希望能够结合逐字和数学符号,因为它目前可用于铸造, 例如。
如果能提供一个可行的示例我将非常感激。
答案1
如果你愿意使用外部工具,那么t-vim
提供突出显示许多语言。您可以按如下方式使用它:定义一个类型
\usemodule[vim]
\definevimtyping [RUBY] [syntax=ruby]
然后使用它作为一个环境
\startRUBY
...
\stopRUBY
或内联
\inlineRUBY{...}
此模块不支持数学转义,但使用 luatex 可以轻松支持。这是一个完整的示例。
\newcatcodetable\minimalmathtable
\startcatcodetable \minimalmathtable
\catcode\backslashasciicode = \escapecatcode
\catcode\leftbraceasciicode = \begingroupcatcode
\catcode\rightbraceasciicode = \endgroupcatcode
\catcode\endoflineasciicode = \activecatcode
\catcode\formfeedasciicode = \activecatcode
\catcode\spaceasciicode = \activecatcode
\catcode\dollarasciicode = \mathshiftcatcode
\stopcatcodetable
\unprotect
\starttexdefinition mathescaped #1
\pushcatcodetable
\setcatcodetable \minimalmathtable
\ctxcommand{parsemath(\!!bs #1 \!!es)}
\popcatcodetable
\stoptexdefinition
\protect
\startluacode
local function unescape(content)
local s = string.gsub(content, '\\\\', '\\')
s = string.gsub(s, '\\{', '{')
s = string.gsub(s, '\\}', '}')
return s
end
local dollar = lpeg.P("$")
local nodollar = (1 - dollar)
local math = lpeg.Cs(dollar * nodollar^0 * dollar) / unescape
local any = lpeg.P(1)
local match = lpeg.Cs( (math + any)^0 )
function commands.parsemath(content)
local s = lpeg.match(match, content)
tex.sprint(s)
end
\stopluacode
\usemodule[vim]
\startcolorscheme[pscolor]
\definesyntaxgroup
[Comment]
[command=\mathescaped]
\stopcolorscheme
\definevimtyping[python][syntax=python]
\starttext
\startpython
# Returns $\sum_{i=1}^{n}i$
def sum_upto(n)
r = range(1, n+1)
return sum(r)
\stoppython
\stoptext
与列表包相同的限制适用,即空格处于活动状态,因此您应该避免在数学模式下使用空格。
编辑:模块的新版本(2012.12.17)t-vim
支持Comment
区域中的数学转义。要激活它,您需要传递escape=on
到\definevimtyping
并使用\m{...}
或\math{...}
数学模式。因此,您可以使用上述临时解决方案,而不是
\definevimtyping[python][syntax=python, escape=on]
\startpython
# Returns \m{\sum_{i=1}^{n}i}
def sum_upto(n)
r = range(1, n+1)
return sum(r)
\stoppython