The Happenings with TexCreate v3
Tags: programming, rust, news, opensource
Published: 2023-01-26 18:16:05

The latest TexCreate version is v2.2.1 and that was released over 9 months ago. So considering that the transition from TexCreate v1 to 2 was a few months of development, why is this taking so long? 

## A Focus on Template Modularity 

The known flaw I had with the current version with TexCreate is "hard coding" the templates inside the application. For those unaware, TexCreate is a LaTeX project manager that utilizes prebuilt templates to build projects for various needs. In v2 I transitioned to using a native Rust library `tex-rs` to build the LaTeX code, but the library wasn't modular itself. 

So what do we do? My first focus was building a library I can expand, and that's where the development with `texcore` started. After 6 months of development, it is what I consider ready for TexCreate, the latest version at the time of writing is `v0.4.10`. The library can be found in [crates.io](https://crates.io/crates/texcore/0.4.10). The interesting new feature in `v0.4` is the TexCreate Template feature which provides the `template` module with the following type: 

```{rust}
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, PartialOrd)]
pub struct Template {
    pub name: String,
    pub description: String,
    pub version: Version,
    element_list: RefCell<ElementList<Any>>,
}
```

### Custom Templates? 

At the current moment I plan to only have the application use first-party templates I develop, but there are plans to add functionality for custom templates. 

How would that work? Well when TexCreate is initialized it will create a directory in `$HOME/.texcreate`. The current plan is to keep all templates JSON files there, but what can happen is that inside of the `.texcreate` directory we may have the following structure: 

```
.texcreate/
     mkproj/
        Basic.json
     custom/
        Foo.json 
```

A sample Template may look like the following: 

```{json}
{
  "name": "Basic",
  "description": "This is a basic LaTeX document",
  "version": {
    "major": 1,
    "minor": 0,
    "patch": 0
  },
  "element_list": {
    "metadata": {
      "author": "author",
      "date": "date",
      "title": "title",
      "fontsize": 11,
      "doc_class": "article",
      "maketitle": true
    },
    "list": [
      {
        "value": {
          "value": "\\pagenumbering{arabic}",
          "type_": "T_Custom",
          "level": "Document",
          "header_level": null,
          "text_type": null,
          "list_type": null,
          "items": null,
          "elements": null
        },
        "type_": "T_Custom",
        "level": "Document"
      },
      {
        "value": {
          "value": "\\newpage",
          "type_": "T_Custom",
          "level": "Document",
          "header_level": null,
          "text_type": null,
          "list_type": null,
          "items": null,
          "elements": null
        },
        "type_": "T_Custom",
        "level": "Document"
      },
      {
        "value": {
          "value": "amsmath",
          "type_": "T_Package",
          "level": null,
          "header_level": null,
          "text_type": null,
          "list_type": null,
          "items": null,
          "elements": null
        },
        "type_": "T_Package",
        "level": "Packages"
      }
    ]
  }
}
```

The following Template then would be processed and converted into the following TeX code: 

```{tex}
\documentclass[11pt, letterpaper]{article}
\title{title}
\author{author}
\date{date}
\usepackage{amsmath}
\begin{document}
\maketitle
\pagenumbering{arabic}
\newpage
\end{document}
```


## What's Happening Now...

Currently I am developing `texcreate-services` which aims to be a suite of applications to manage the templates for TexCreate. This part of the project may not be opensource because it could become a vulnerability to the project and considering its the core function I rather not have that risk. However, I plan to write an application that would help developers create their own custom templates once that functionality is enabled. 

This project has a lot of improvements and with that comes a lot of testing and development time. Considering how I always manage to be busy, I suspect that a stable version may be released until sometime in 2024.