ConTeXt 中的代码高亮显示

ConTeXt 中的代码高亮显示

使用 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

相关内容