Elixir Code listings and snippets in LaTeX?

Hi guys! Has anyone found (or has a way) to insert good Elixir code listing and snippets in LaTeX? Something with automatic color highlights. I’m using the listings package and while it’s got support for a ton of languages (including Erlang) it does not have for Elixir :frowning2:

I guess I could always insert them as images although I don’t find that to be very correct for a formal document.

2 Likes

I do not believe there exists a library for LaTeX that does Elixir-highlighting right now. However, as Elixir’s syntax is actually quite regular (i.e. there are not a lot of edge-cases), creating such a library should not be extremely difficult (but, you know, still difficult). There do exist syntax highlighting packages for Sublime, Atom, Emacs and the likes, so maybe some of their logic could be ported to a LaTeX library.

2 Likes

Yeah I guessed there wouldn’t be a package for it. Although I’ve been experimenting and I think the Ruby highlight should be okayish!

1 Like

If you do not fear \write18 and have a recent version of pygments installed, you can use minted package.

4 Likes

I’m actually writing a paper on concurrency and I’m using tons of Elixir code. :smile:

I’m using the listings package and created a definition for the Elixir lang.

Some things like atoms and module attributes don’t work quite like I would prefer, but it is better than creating images and pasting then all the time :fearful:

Here’s the definition:

\lstdefinelanguage{elixir}{
	morekeywords={case,catch,def,do,else,false,%
		use,alias,receive,timeout,defmacro,defp,%
		for,if,import,defmodule,defprotocol,%
		nil,defmacrop,defoverridable,defimpl,%
		super,fn,raise,true,try,end,with,%
		unless},
	otherkeywords={<-,->},
	sensitive=true,
	morecomment=[l]{\#},
	morecomment=[n]{/*}{*/},
	morestring=[b]",
	morestring=[b]',
	morestring=[b]"""
}

And here’s the rendered result:

9 Likes

I made some minor changes to this, and ended up with highlighted keywords. The only downside is that a keyword needs to be followed by a space to make the parser happy.

\lstdefinelanguage{elixir}{
    morekeywords={case,catch,def,do,else,false,%
        use,alias,receive,timeout,defmacro,defp,%
        for,if,import,defmodule,defprotocol,%
        nil,defmacrop,defoverridable,defimpl,%
        super,fn,raise,true,try,end,with,%
        unless},
    otherkeywords={<-,->, |>, \%\{, \}, \{, \, (, )},
    sensitive=true,
    morecomment=[l]{\#},
    morecomment=[n]{/*}{*/},
    morecomment=[s][\color{purple}]{:}{\ },
    morestring=[s][\color{orange}]"",
    commentstyle=\color{commentgreen},
    keywordstyle=\color{eminence},
    stringstyle=\color{red},
	showstringspaces=false,
}

I have put an entire minimal example online here: https://gist.github.com/m1dnight/95f405c9c41f208a16df0a68b6ccbfda

The rendered output looks as follows:

4 Likes

You could always write a latex macro to call out to @tmbb’s syntax highlighter or so too, I think you could plug in a new backend to generate latex out pretty easily?

Sure, and that would allow you to be much more precise in complex bits of syntax, such as sigils and string interpolation. It woukd require packaging Makeup’s highlighter into an escript that highlights the input given by stdin. That’s a little beyond my elixir skills right now (I don’t use Elixir for scripting), but it can be done.

Sure. For someone who knows tex and latex well it can be done in an afternoon. The token format returned by the makeup lexers is stable (although not documented outside the source code, because I can’t think of a way to document them better) and is considered part of the public API, so writing a LaTeX formatter would be easy (again, assuming you’re a TeX pro, which i am not).

Your best bet, if you can read and write Python, is to translate the formatter from Pygments xD (most of Makeup is a blatant rippoff of Pygments anyway)

1 Like

If you really want proper highlighting, there is always the minted[1] package, which works great. However, I had a hard constraint on lstlistings, so I could not use it.

I think that if we were to improve the highlighting, we should improve no pygments, the backend that is used by minted in latex.

[1] https://www.sharelatex.com/learn/Code_Highlighting_with_minted

Indeed, but Makeup is a much better highlighter for elixir. You can replicate Makeup’s pexer in Pygments, but it’s hard because of Pygment’s “weird” architecture.

1 Like

There is another option to do it: a vim plugin to generate listings with colorscheme of vim. It does not depend on syntax highlighting of listings and we can utilize syntax highlighting in vim for LaTeX:) The output looks quite beautiful.

2 Likes