Take the 2-minute tour ×
TeX - LaTeX Stack Exchange is a question and answer site for users of TeX, LaTeX, ConTeXt, and related typesetting systems. It's 100% free, no registration required.

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.

share|improve this question
1  
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
show 7 more comments

1 Answer

up vote 9 down vote accepted
+100

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

\usemodule[vim]
\definevimtyping [RUBY]  [syntax=ruby]

and then use it either as an evnironment

    \startRUBY
      ...
    \stopRUBY

or inline

    \inlineRUBY{...}

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


\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

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]                                                                                     

\startpython
# Returns \m{\sum_{i=1}^{n}i}
def sum_upto(n)
    r = range(1, n+1)
    return sum(r)
\stoppython
share|improve this answer
    
(+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
    
@chl: This is now supported by the latest version of the module. –  Aditya Dec 17 '11 at 20:29
show 1 more comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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