Skip to main content

lastlint: LaTeX strict linter

A linter for Evan Chen's LaTeX style guide.

Usage

Pre-commit hook

Add to your .pre-commit-config.yaml:

repos:
  - repo: https://github.com/cjquines/lastlint
    rev: v0.4.1 # x-release-please-version
    hooks:
      - id: lastlint-fix

To only report errors rather than auto-fixing them, use the lastlint hook id.

Standalone

pip install .
lastlint path/to/file.tex another.tex

Multiple files are accepted, and glob patterns are expanded.

Pass --fix to auto-fix supported rules in place.

Pass --ignore E001,E013 to skip both reporting and fixing.

On a terminal, output is grouped per file and colorized; when piped or redirected it uses a plain file:line:col: EXXX: message format parseable by editors. Force either mode with --color always or --color never (also honors NO_COLOR and FORCE_COLOR).

Suppression

Add an inline comment to skip rules on a single line:

This text has "intentional" quotes.  % lastlint: disable=E002

Rules

Fixable rules are marked with 🔧.

ID Rule from style guide
E001 Line length must be ≤ 120
E002 🔧 No literal "
E003 🔧 Operators (\sin etc.) must be commands
E004 🔧 No \ldots, \cdots, or ...
E005 🔧 No grammatical punctuation inside inline math
E006 🔧 No extraneous space before punctuation
E007 Spacing around = must be symmetric
E009 🔧 No bad math operators (| etc.)
E010 🔧 No $$ ... $$
E011 No adjacent \[ ... \] blocks
E012 \begin{align*} / \end{align*} must have own line
E013 🔧 Env contents must be indented
E014 🔧 No trailing whitespace
E015 No \\\\ paragraph break
E017 🔧 No : for function signatures

Rules not implemented:

  • Rule 8 (balanced delimiters): hard to lint reliably.
  • Rule 16 (variables in prose): requires natural-language understanding.

E001

E001 skips two kinds of unfixable long lines: those containing a URL (http:// or https://), and fully-commented lines (only whitespace before the %). Lines with a long trailing comment after real content are still flagged.

I recommend SemBr for automatically adding line breaks.

E004

E004 picks the right \dots variant from context (\dotsc after a comma, \dotsb after an operator) and leaves a \cdots unresolved when neither side determines spacing.

E013

E013 checks every env except a small denylist: document, center, quote, and the verbatim envs (asy, verbatim, lstlisting, …). See NO_INDENT_ENVS in lastlint.py to adjust.

The --fix pads under-indented lines inside indent envs to 2 * depth spaces (already-correctly-indented or deeper lines are left alone).

Development

pip install -e .[dev]
pytest

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

lastlint-0.4.1.tar.gz (15.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

lastlint-0.4.1-py3-none-any.whl (13.1 kB view details)

Uploaded Python 3

File details

Details for the file lastlint-0.4.1.tar.gz.

File metadata

  • Download URL: lastlint-0.4.1.tar.gz
  • Upload date:
  • Size: 15.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for lastlint-0.4.1.tar.gz
Algorithm Hash digest
SHA256 d89f6687e4d094c6a43d90310caf7fa999212d30d2eb77bf811b5f543d1c5239
MD5 7906a23e7c73c128dcfbddea568c1e64
BLAKE2b-256 55ad9755b2cf89393a373f4046e1a45ab08ed27c9c0fca705d00cbd8fe27039a

See more details on using hashes here.

Provenance

The following attestation bundles were made for lastlint-0.4.1.tar.gz:

Publisher: release-please.yml on cjquines/lastlint

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file lastlint-0.4.1-py3-none-any.whl.

File metadata

  • Download URL: lastlint-0.4.1-py3-none-any.whl
  • Upload date:
  • Size: 13.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for lastlint-0.4.1-py3-none-any.whl
Algorithm Hash digest
SHA256 57764e95d6a5d4b8fde51ecec51694ec8dcdc660f525d8065584b20647a2c8ad
MD5 bfc09ee39c0064beb664862ad0fc38f2
BLAKE2b-256 7090b2701298d933a88241ae4e964e07babd6b420a7ed675fc0c4423a3fdb9ac

See more details on using hashes here.

Provenance

The following attestation bundles were made for lastlint-0.4.1-py3-none-any.whl:

Publisher: release-please.yml on cjquines/lastlint

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

0.5.1

2 files

0.5.0

2 files

This release

0.4.1 This release

2 files

0.4.0

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page