14 unstable releases (3 breaking)
new 0.4.7 | Nov 15, 2024 |
---|---|
0.4.4 | Sep 29, 2024 |
0.3.0 | Jul 31, 2024 |
#39 in Command line utilities
624 downloads per month
51KB
1K
SLoC
tex-fmt
An extremely fast LaTeX formatter written in Rust.
Input | Output |
|
|
- ⚡ Extremely fast run-time performance
- 🔧 Minimal configuration required
- 📟 Command-line interface
- 📜 Handles LaTeX file types
.tex
,.bib
,.cls
, and.sty
- 🦀 Written entirely in safe Rust
Installation
Cargo
Install the stable release with
cargo install tex-fmt
Install from GitHub with
cargo install --git "https://github.com/wgunderwood/tex-fmt"
Nix
Install from nixpkgs into a temporary shell with
nix-shell -p tex-fmt
Build from source using flakes with
nix build "github:wgunderwood/tex-fmt"
Add to your NixOS installation with
environment.systemPackages = [
pkgs.tex-fmt
];
Arch Linux
Install from the Arch User Repository. For example, using the yay AUR helper:
yay -S tex-fmt
Homebrew
Install using Homebrew with
brew install tex-fmt
Binary download
Binaries for various platforms are available on the GitHub releases page.
Visual Studio Code
Integration with VS Code is provided by the LaTeX Workshop extension. You will need to first install tex-fmt through one of the above methods.
Usage
tex-fmt file.tex # format file.tex and overwrite
tex-fmt --check file.tex # check if file.tex is correctly formatted
tex-fmt --print file.tex # format file.tex and print to STDOUT
tex-fmt --keep file.tex # do not wrap long lines
tex-fmt --stdin # read from STDIN and print to STDOUT
tex-fmt --help # view help information
Disabling the formatter
Ending a source line with % tex-fmt: skip
disables formatting for that line.
To disable the formatter for a block, use % tex-fmt: off
and % tex-fmt: on
.
\documentclass{article}
\begin{document}
This line is skipped % tex-fmt: skip
% tex-fmt: off
These lines are also
not formatted or wrapped
% tex-fmt: on
\end{document}
Verbatim environments including verbatim
, Verbatim
, lstlisting
and minted
are automatically skipped.
Performance
When formatting all of the test cases, tex-fmt is over a thousand times faster than latexindent.
Files | Lines | Size | tex-fmt | latexindent | latexindent -m |
---|---|---|---|---|---|
51 | 94k | 3.5M | 0.055s | 106s [x1927] | 127s [x2309] |
Contribution
Please feel free to open an issue or submit a pull request,
including as much information as you can. Documentation of internals
can be accessed by cloning this repository and running cargo doc
.
Alternatively, you can Buy Me a Coffee!
Limitations
- Semantic parsing of LaTeX code not conducted
- No linting or correction of syntax errors
- Customization via configuration files not supported
- Compliance with existing formatting guidelines not guaranteed
- No spelling or grammar checking
Existing tools
-
latexindent. Perl script, many configuration options, slow on large files
-
LaTeXTidy. Perl script, download links seem to be broken
-
latex-pretty. Browser-based, uses latexindent as the backend
-
latexformat.com. Browser-based
-
texpretty. C program which works sometimes and appears to be fast
-
latex-editor. Browser-based
-
LaTeXFmt. Vim plugin, does not apply indentation
-
latex-formatter. Visual Studio plugin, uses latexindent as the backend
Options
The following command-line options are offered by tex-fmt.
Option | Alias | Default | Description |
---|---|---|---|
--check |
-c |
Check formatting, do not modify files. | |
--print |
-p |
Print to STDOUT, do not modify files. | |
--keep |
-k |
Keep lines, do not wrap. | |
--verbose |
-v |
Show info log messages. | |
--quiet |
-q |
Hide warning messages. | |
--trace |
-t |
Show trace log messages. | |
--stdin |
-s |
Process STDIN as a single file, output formatted text to STDOUT. | |
--tab |
2 |
Number of spaces to use as tab size. | |
--usetabs |
Use tabs instead of spaces for indentation. | ||
--wrap |
80 |
Line length for wrapping. | |
--help |
-h |
Print help. | |
--version |
-V |
Print version. |
Dependencies
~4–15MB
~138K SLoC