Packages

Render MathJax equations as PNG & SVG files

Current section

Files

Jump to
math_jax lib math_jax.ex
Raw

lib/math_jax.ex

defmodule MathJax do
@moduledoc """
This library provides an Elixir wrapper around the Rust
[mathjax_svg](https://github.com/gw31415/mathjax_svg) library. This allows you
render SVGs and PNGs of mathematical expressions right in Elixir.
"""
alias MathJax.Native
@doc """
Render a mathematical expression as a standalone block. The rendered
expression has looser margins and is meant to be displayed as a
standalone figure versus inline with text. If you need to render
expressions inline with text, take a look at the `render_inline/2`
function.
"""
def render(expression, :svg) do
expression
|> Native.render_svg()
|> wrap_result()
end
def render(expression, :png) do
render(expression, {:png, 3.0})
end
def render(expression, {:png, scale}) do
expression
|> Native.render_png(scale)
|> wrap_result()
end
@doc """
Same as `render/1` but raises on error and returns
just the result on success.
"""
def render!(expression, format) do
case render(expression, format) do
{:ok, result} -> result
{:error, reason} -> raise "MathJax rendering failed: #{inspect(reason)}"
end
end
@doc """
Render a mathematical expression inline. The rendered
expression has tighter margins and the display is much tighter.
"""
def render_inline(expression, :svg) do
expression
|> Native.render_svg_inline()
|> wrap_result()
end
def render_inline(expression, :png) do
render_inline(expression, {:png, 2.0})
end
def render_inline(expression, {:png, scale}) do
expression
|> Native.render_png_inline(scale)
|> wrap_result()
end
@doc """
Same as `render_inline/1` but raises on error and returns
just the result on success.
"""
def render_inline!(expression, format) do
case render_inline(expression, format) do
{:ok, result} -> result
{:error, reason} -> raise "MathJax rendering failed: #{inspect(reason)}"
end
end
# ---- Private helpers ----
defp wrap_result(result) when is_binary(result) do
{:ok, result}
end
defp wrap_result(error) do
error
end
end