####
3.6 KiB

# Natural display engine with TeX syntax for fx-9860G and fx-CG 50

This library is a customizable 2D math rendering tool for calculators. It can be used to render 2D formulae, either from an existing structure or TeX syntax.

```
\frac{x^7 \left[X,Y\right] + 3\left|\frac{A}{B}\right>}
{\left\{\frac{a_k+b_k}{k!}\right\}^5}
+ \int_a^b \frac{\left(b-t\right)^{n+1}}{n!} dt
+ \left(\begin{matrix} \frac{1}{2} & 5 \\ -1 & a+b \end{matrix}\right)
```

## Features

- Build formulae from TeX syntax or using the structural API
- Highly-customizable graphical and layout parameters
- Drawing uses only a few user primitives (point, line, text size, text)
- Compatible with fxlib and gint

List of currently supported elements:

- Fractions (
`\frac`

) - Subscripts and superscripts (
`_`

and`^`

) - Grouping parentheses, brackets, and braces (
`\left`

and`\right`

) - Grouping angle brackets, vertical lines, and dots (invisible)
- Sums, products and integrals (
`\sum`

,`\prod`

and`\int`

) - Vectors (
`\vec`

) and limits (`\lim`

) - Square roots (
`\sqrt`

) - Matrices (
`\begin{matrix} ... \end{matrix}`

)

Features that are partially implemented (and what is left to finish them):

- Support for inline style and display style (expose a parameter)
- Theme that can decently port to fx-CG 50 (suitable parenthesis styles)

See the `TODO.md`

file for more features to come.

## Building

First specify the platform you want to use :

`cli`

is for command-line tests, with no visualization (PC)`sdl2`

is an SDL interface with visualization (PC)`fx9860g`

builds the library for fx-9860G targets (calculator)`fxcg50`

builds the library for fx-CG 50 targets (calculator)

For calculator platforms, you can use `--toolchain`

to specify a different toolchain than the default `sh3eb`

and `sh4eb`

. The install directory of the library is guessed by asking the compiler, you can override it with `--prefix`

.

Example for an SDL setup:

```
% ./configure --platform=sdl2
```

Then you can make the program, and if it's a calculator library, install it. You can later delete `Makefile.cfg`

to reset the configuration, or just reconfigure as needed.

```
% make
% make install # fx9860g and fxcg50 only
```

## Using in a program

Before using the library in a program, a configuration step is needed. The library does not have drawing functions and instead requires that you provide some, namely:

- Draw a pixel (
`TeX_intf_pixel`

) - Draw a line (
`TeX_intf_line`

) - Compute the size occupied by a string (
`TeX_intf_size`

) - Render a string (
`TeX_intf_text`

)

The three rendering functions are available in fxlib; for monospaced fonts the fourth can be implemented trivially. In gint, the four can be defined as wrappers for `dpixel()`

, `dline()`

, `dsize()`

and `dtext()`

.

The type of formulae is `TeX_Env`

. To parse and compute the size of a formula, use the `TeX_parse()`

function, which returns a new formula object (or `NULL`

if a critical error occurs). The second parameter `display`

is set to non-zero to use display mode (similar to `\[ .. \]`

in LaTeX) or zero to use inline mode (similar to `$ .. $`

in LaTeX).

```
char *code = "\\frac{x_7}{\\left\\{\\frac{\\frac{2}{3}}{27}\\right\\}^2}";
struct TeX_Env *formula = TeX_parse(code, 1);
```

The size of the formula can be queried through `formula->width`

and `formula->height`

. To render, specify the location of the top-left corner and the drawing color (which will be passed to all primitives):

```
TeX_draw(formula, 0, 0, BLACK);
```

The same formula can be drawn several times. When it is no longer needed, free it with `TeX_free()`

:

```
TeX_free(formula);
```