Typesetting Julia Code in Latex Documents (Unicode)

Hey there,

I love how I can use Unicode in Julia programming. When trying to write my report about my work I encountered a problem, though. Regular LateX is not compatible with Unicode characters.
This is not a problem in equations as you can use \alpha and such but this doesn’t work properly with
code embedded through listings or minted.

Luckily there is a fix for people who don’t want to give up and
stop using Unicode characters while coding.

This is a report of what I did to make it work and I hope it will
be helpful to others in the future.

  1. Change LateX Engine
    The standard LateX engine pdfLateX is not capable of having Unicode in your .tex file.
    A more recent engine that can do this is LuaLateX or XeTeX.
    I chose LuaLateX. ( You can set this in the settings of your LateX editor)

  2. Change Font encoding / Language packages
    Instead of using:
    \usepackage[utf8]{inputenc}
    \usepackage{babel}
    use:
    \usepackage{fontspec}
    \usepackage{polyglossia}
    which are more recent implementations. You also need to set a font that
    has all the characters you want to use. For example:
    \setmonofont{DejaVu Sans Mono}[Scale=MatchLowercase]

  3. Install Minted
    This package uses a python library called Pygmentize to proberly set the code.
    To make this possible it needs to be allowed to call Python in the first place.
    For this add –shell-escape as a flag to LuaLateX in the settings of your editor.
    You will probably also need to install Pygmentize as well. See the documentation of minted.

  4. \usepackage{unicode-math}
    This allows you to write unicode characters within math equations.

  5. Have fun with it:
    Here is a minimal working example:

\documentclass[12pt,a4paper]{scrartcl}

\usepackage{fontspec}
\usepackage{polyglossia}
\setmonofont{DejaVu Sans Mono}[Scale=MatchLowercase]
\usepackage{minted}

\usepackage{latexsym,exscale,stmaryrd,amsmath,amssymb}
\usepackage{unicode-math}

\begin{document}
\begin{minted}{julia}
function f(τ)
return π * τ
end
\end{minted}

\begin{minted}{julia}
∀ ε > 0 ∃ δ > 0 : ∀x,y ∈ ℝ : ||x-y|| < ε ⇒ ||f(x) - f(y)|| < δ
\end{minted}

$∀ ε > 0 ∃ δ > 0 : ∀x,y ∈ ℝ : ||x-y|| < ε ⇒ ||f(x) - f(y)|| < δ$
\end{document}

Screenshot%20from%202018-04-05%2016-57-58

Note on entering greek letters:
If you are like me and don’t use the Caps-lock key very often.
Linux allows you to reprogram that key. You can make it change the layout to greek while the key is pressed.
So caps-lock + a creates an α.

Have fun with it!
Best,
Jonas

15 Likes

This post seems to be incomplete.

Yes, I’m sorry about that.
I must have hit a the wrong button while typing.

I am not sure about this. The MWE

\documentclass[a4paper,12pt]{article}
\usepackage[utf8x]{inputenc}
\usepackage{textgreek}
\usepackage{minted}
\begin{document}
\begin{minted}{julia}
foo(α, β) = α ≤ β
\end{minted}
\end{document}

renders fine.

Interesting. I looked at the documentation of textgreek and didn’t find where it says that you can directly enter
greek letters.

It does still have the downside of not allowing all of unicode and not being available in equations,
as the package unicode_math is only compatible with LuaLateX and XeTeX.

Your suggestion might be easier though, if one is happy without those extras.

I would still prefer LuaTeX, but when cooperating with people on documents I have learned not to take a working LuaTeX for granted. So making pdflatex work is IMO beneficial, even if it involves a bit of effort.

Thanks for highlighting minted — it provides a very nice rendering.

Thanks for posting this. Also, if there are any symbols which don’t show, you can see the responses to my question which show how to replace unicode symbols with latex ones (where required)

I can add to this old conversation that a nice pygements lexer for the julia language is provided here
https://github.com/sisl/pygments-julia
use this together with minted, it’s better than the one bundled with pygments.

I further made a highlighting scheme trying to get it as close as possible to the default in atom, atomone, it’s available here
https://github.com/baggepinnen/configs/blob/master/scripts/atomone.py

8 Likes

Another point to consider is that arXiv compiles with pdflatex and not lualatex.

6 Likes

I actually literally the other week ran into this exact issue because I wanted Julia code in my paper, and emailed arXiv who said they are willing to make exceptions and just accept compiled PDF’s, which you can do with lualatex or whatever you’d like. Although fwiw I actually went with a different solution which is just compiling the Julia code separately on my own, then \includegraphics’ing it.

One more thing to consider about the minted package is that in order for it to work properly with latexmk the $out_dir cannot be set to anything but ".". I had this issue and it took some time to figure out what exactly went wrong.

The codes seem pretty neat for Greek letters. However, it does not work for bold letters

\documentclass{article}
\usepackage{minted}
\usepackage{fontspec}
\usepackage{polyglossia}
\usepackage{unicode-math}

\usepackage{xunicode}
\setmonofont{DejaVu Sans Mono}[Scale=MatchLowercase]

\usepackage{newunicodechar}
\begin{document}
\begin{minted}[breaklines,escapeinside=||,mathescape=true, linenos, numbersep=3pt, gobble=2, frame=lines, fontsize=\small, framesep=2mm]{julia}
    using Convex, SCS, Plots, LaTeXStrings

    N = 30 # N in the set {0, 1, ..., N}
    n = 3 # order of the linear dynamical system
    x_des = [7, 2, -6] # constraint -> 𝐱(N) == x_des
    # model parameters
    𝐀 = [-1 .4 .8; 1 0 0; 0 1 0]
    𝐛 = [1, 0, 0.3]

    𝐗 = Variable(n, N+1) # [𝐱(0) 𝐱(1) ... 𝐱(N)]
    𝐮 = Variable(1, N) # [u(0) u(1) ... u(N-1)]
    f0 = sum(max(abs(𝐮), 2abs(𝐮)-1)) # objective function
    constraints = [
        𝐗[:,2:N+1] == 𝐀*𝐗[:,1:N]+𝐛*𝐮, # recursive equation
        𝐗[:,1] == zeros(n), # initial condition
        𝐗[:,N+1] == x_des, # final condition
    ]
    problem = minimize(f0, constraints)
    solve!(problem, SCS.Optimizer; silent_solver = true)

    fig = plot(vec(𝐮.value), xlabel=L"k", title=L"u(k)", line=:steppre)
    savefig(fig, "figs/4.17.png")
\end{minted}
\end{document}

The generated PDF is

How can I solve it? I tried to use some of Nerd Font patches, by using

\setmonofont[Path = /home/tapyu/.local/share/fonts]{Meslo LG M DZ Regular Nerd Font Complete.ttf}

but it does not work…

  1. I’ve tried with both XeLaTeX and LuaLaTeX engines