A ready-to-use VS Code dev container for LaTeX, for amd64 and arm64:
- TeX Live 2026 (
scheme-full, upstream, without docs/sources), incl.latexmk,biber, minted v3, ZUGFeRD/XRechnung (zugferd) - LaTeX Workshop with
latexmkrecipes (incl. a<file>-Solutionbuild), LTeX+ (grammar/spell checking, ships offline withltex-ls-plus), LaTeX Utilities, Comment Anchors inkscape(for thesvgpackage),pandoc,hunspell(de_DE, en_US),poppler-utils
TeX Live no longer comes from Ubuntu's texlive-* packages. The image now installs TeX Live 2026 upstream via install-tl. Ubuntu's frozen TeX Live shipped a minted/latexminted that is broken with Python 3.14.
If you use the image via :main or :latest, please note:
- TeX Live lives in
/usr/local/texlive. Install packages withsudo tlmgr install <pkg>, no longer withapt. - Extensions and settings now come with the image. Your copied
devcontainer.jsonkeeps working (your values win), but you can shorten it to the minimal example below. - New tags: use
:2026to stay on TeX Live 2026, or:2026-YYYYMMDDto pin a build (see Tags).
Create .devcontainer/devcontainer.json in your project:
Then run Dev Containers: Reopen in Container. Extensions and settings come with the image.
Override settings or skip extensions as needed. Your values in .devcontainer/devcontainer.json win per key. Use a leading - to exclude an extension:
{
"name": "LaTeX",
"image": "ghcr.io/chearix/vscode-devcontainer-latex:2026",
"customizations": {
"vscode": {
"settings": { "ltex.language": "de-DE" },
"extensions": [ "-ExodiusStudios.comment-anchors" ]
}
}
}Existing, fully copied devcontainer.json files keep working and can now be shortened to the above.
| Tag | Moves? | Use |
|---|---|---|
:2026 |
within TeX Live 2026 | recommended: latest build with TeX Live 2026 |
:2026-YYYYMMDD |
no | pin a specific build / roll back |
:latest, :main |
yes | latest build of the current TeX Live year |
:sha-<commit> |
no | build of a specific commit |
Images are rebuilt monthly and only tagged after the test suite passed.
-
Install additional packages with
sudo tlmgr install <pkg>, not withapt install texlive-*(that would add a second TeX Live with several GB). -
minted works without
-shell-escape. The recipe still passes--shell-escapebecause thesvgpackage needs it. -
LaTeX Workshop recipes:
latexmk(default),latexmk (solution)andlatexmk (document + solution). The solution build sets the job name to<file>-Solution, so a document can switch on solutions itself, e.g. with theexamclass:\usepackage{xstring} \IfEndWith*{\jobname}{Solution}{\printanswers}{\noprintanswers}
Documents without such a switch simply get a second, identical PDF.
Opening this repo in VS Code builds the image locally (initializeCommand). For Podman, set DOCKER=podman on the host.
make build # build image (IMG=..., PLATFORM=linux/arm64, DOCKER=podman)
make test IMG=... # run the bats suite in tests/ against an image
make test-local # run the suite inside the dev container
{ "name": "LaTeX", "image": "ghcr.io/chearix/vscode-devcontainer-latex:2026" }