universelabSCI · CLI · BIO

ES

Linting & Formatting

Linter — texforge check

Runs static analysis without compiling, including spell-check:

Check What it verifies
\input{file} referenced file exists
\includegraphics{img} image exists
\cite{key} key exists in the .bib file
\ref{label} / \label{label} cross-reference consistency
\begin{env} / \end{env} no unclosed environments
Spelling prose against language-specific dictionaries

Errors come with file, line and a suggestion:

ERROR [main.tex:47]
  \includegraphics{missing.png} — file not found

ERROR [main.tex:12]
  \cite{smith2020} — key not found in .bib

ERROR [main.tex:23]
  \begin{figure} never closed
  suggestion: Add \end{figure}

ERROR [main.tex:18]
  mispeled — not in dictionary

Spell-Check

Language is detected from the document:

  • \usepackage[spanish]{babel} — uses Spanish Hunspell dictionary
  • \usepackage[polyglossia]{...} — language extracted from polyglossia declaration
  • No declaration — falls back to texforge config language (default: english)

Dictionaries download automatically into ~/.texforge/dicts/ on first use.

Manage custom words with texforge spell:

# Add to global dictionary (all projects)
texforge spell add "LaTeX" "UUID"

# Add to current project only
texforge spell add "ProjectCodename" --local

# List and remove
texforge spell list [--local]
texforge spell remove "LaTeX" [--local]

Both scopes are unioned at check time — project-local and global words are both respected.

Formatter — texforge fmt

Applies opinionated formatting inspired by rustfmt:

  • Consistent indentation (2 spaces) inside environments
  • Collapsed multiple blank lines
  • Aligned \begin{} / \end{} blocks

One canonical output regardless of input style — git diffs stay clean.

texforge fmt           # format in place
texforge fmt --check   # check without modifying (CI-friendly)

fmt --check exits non-zero when files would change, which makes it easy to enforce formatting in CI.