What is the best way to highlight code when using ConTeXt? I am aware of support for specific languages, as described on the ConTeXt wiki, but it seems rather limited at present. I know that we could also rely on vim, through the t-vim module.

Now, I wonder if there exists more automated ways to deal with other languages like R, Python, Lisp, Asymptote? Also, I would like to be able to combine verbatim and mathematical notations, as it is currently available in Minted, for example.

A working example would be very appreciated.

  • 2
    t-vim can deal with any language for which there is syntax highlighting support in vim. – Aditya Dec 26 '10 at 20:40
  • 1
    @chl: minted isn't a pure Latex solution, since it relies on Pygments, the Python syntax highlighter. – Charles Stewart Dec 26 '10 at 22:44
  • 1
    MkIV has a new parser/pretty-printer. See the ConTeXt mailing list for a few discussions and look at v-*.(mkiv|lua) files for examples. – Aditya Dec 27 '10 at 15:57
  • 1
  • 1
    @Aditya: Can you link to the discussion of this pretty-printer? – Charles Stewart Jan 11 '11 at 11:46

If you are willing to use an external tool, then t-vim provides highlighting for many languages. You can use it as follows: define a typing

\definevimtyping [RUBY]  [syntax=ruby]

and then use it either as an evnironment


or inline


This module does not support math escape, but with luatex, it is easy to support. Here is a complete example.


\startcatcodetable \minimalmathtable
    \catcode\backslashasciicode  = \escapecatcode
    \catcode\leftbraceasciicode  = \begingroupcatcode  
    \catcode\rightbraceasciicode = \endgroupcatcode
    \catcode\endoflineasciicode  = \activecatcode
    \catcode\formfeedasciicode   = \activecatcode
    \catcode\spaceasciicode      = \activecatcode
    \catcode\dollarasciicode     = \mathshiftcatcode

\starttexdefinition mathescaped #1
  \setcatcodetable \minimalmathtable
  \ctxcommand{parsemath(\!!bs #1 \!!es)}

  local function unescape(content)
      local s = string.gsub(content, '\\\\', '\\')
      s = string.gsub(s, '\\{', '{')
      s = string.gsub(s, '\\}', '}')
      return s

  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)






# Returns $\sum_{i=1}^{n}i$
def sum_upto(n)
    r = range(1, n+1)
    return sum(r)


The same restrictions as the listings package apply, i.e., spaces are active, so you should avoid spaces in math mode.

EDIT: The new (2012.12.17) version of t-vim module supports math escape in the Comment region. To active it you need to pass escape=on to \definevimtyping and use \m{...} or \math{...} for math mode. Thus, instead of the above kludge, you can use

\definevimtyping[python][syntax=python, escape=on]

# Returns \m{\sum_{i=1}^{n}i}
def sum_upto(n)
    r = range(1, n+1)
    return sum(r)
  • (+1) Thanks for the working example about math support. It looks great. I'll try this ASAP. – chl Jun 27 '11 at 15:03
  • Just tried it, but cannot get it to work. I encountered errors with Module Catcodes (! Undefined control sequence. <argument> \catcode \tabasciicode) when trying to compile a working example (the above one, or any of those available in your Github repos using context). I don't know why because I succeeded in compiling some files in the past... I shall return to this later. – chl Jun 27 '11 at 19:43
  • Perhaps you are using an old version of ConTeXt. I think that \tabsciicode etc were introduced around April 2011. – Aditya Jun 27 '11 at 22:21
  • Yes, that's what I realized afterwards (I have the minimals beta version on my other computer, but I tested your example on TeXLive 2010 :-) Everything works fine now. Thanks again. – chl Jun 28 '11 at 6:24
  • 2
    Thanks for that (and all you've done with the t-vim module!). – chl Dec 18 '11 at 22:46

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.