After the v0.18.0 release of explcheck, the first issues discovered by the flow analysis are now being reported by the linter, such as E505 (Calling an undefined function). https://github.com/Witiko/expltools/releases/tag/2026-03-04

Performance of the flow analysis has been a constant challenge: some artificial code examples would take months to analyze. https://github.com/Witiko/expltools/issues/156 Version 0.18.1 brought a hard-won speedup of up to two orders of magnitude, reducing those months to mere hours, though there is still significant room for further optimization. https://github.com/Witiko/expltools/releases/tag/2026-03-10 This might make a good topic for a master's thesis.

The plan is still to have a v1.0.0 release ready for TUG 2026, but the flow analysis is far from finished and the project is now almost half a year behind the original schedule. Development is active and healthy, just the initial time expectations were wildly optimistic, making the TUG 2026 deadline increasingly uncertain.

#LaTeX #expl3 #programming #TeXLaTeX

Release 2026-03-04 路 Witiko/expltools

expltools 2026-03-04 explcheck v0.18.0 New features This version of explcheck has implemented the following new features: In human-readable output, mention that further issues may be reported aft...

GitHub
I鈥檝e proposed adding built-in assertion statements to expl3. Curious what others think, would this be useful in your LaTeX code? https://github.com/latex3/latex3/issues/1840 #LaTeX #expl3 #TeX #programming
I am working on the flow analysis step. Despite the sardonic code comments, I am quite enjoying myself. https://github.com/witiko/expltools/pull/152 Code review is welcome. #LaTeX #expl3 #programming #TeXLaTeX
Just published a new explcheck devlog on flow graphs and how explcheck can use them to figure out which function definition each call refers to. More technical than usual, but hopefully it finds its audience. 馃 https://witiko.github.io/Expl3-Linter-11.5/ #LaTeX #expl3 #programming #TeXLaTeX
Static analysis of expl3 programs (11陆): Chunks, edges, flow graphs, confidence, and reaching definitions

Over the past two months, I released three new updates of expltools, the bundle that provides the explcheck static analyzer for the expl3 programming language. These updates include major improvements but did not yet advance the final stage of the pipeline, flow analysis, which I teased in the previous post. That鈥檚 because our work on flow analysis so far has been groundwork: figuring out how to adapt static-analysis techniques to expl3 before moving on to implementation. In this post, I outline the flow graph structure currently used to represent expl3 code and describe our adaptation of the reaching definitions algorithm for dynamically scoped languages like expl3.

Continuing with https://github.com/Witiko/expltools/pull/141, a tighter lower-bound estimate for explcheck's understanding of all expl3 code in TeX Live 2024 increases from 8% to 24% (~3% of all TeX code). This feels encouraging! #LaTeX #expl3 #programming #TeXLaTeX
Support flow analysis by Witiko 路 Pull Request #141 路 Witiko/expltools

This PR makes the following changes: Recognize calls to known or defined functions and function variants as a new statement type FUNCTION_CALL distinct from OTHER_STATEMENT. Only mark expansion...

GitHub

Am Freitag sind die ganzen Umbauarbeiten am #KOMAScript Paket tocbasic etwas ins Stocken geraten, als sich mir aufgedr盲ngt hat, in dessen Zuge eine echte #expl3 Ebene einzuziehen und dabei nat眉rlich intern auf #l3keys umzustellen. Problem waren die key:=value-Optionen (z.B. "indent:=section"), weil l3keys ja neuerdings key:expansion=value beherrscht. Heute kam ich auf die Idee im expl3-Interface key!=value zu verwenden und das LaTeX2e-Interface per tl_replace kompatibel zu halten.

#TeXLaTeX

In PR #141, I began implementing the final processing step of explcheck: flow analysis. Refining our definition of code coverage revealed we may understand less expl3 code than expected: the TeX Live 2024 estimate drops from 14% to just 8%. The upside: this is now strictly a lower bound, so the real figure is almost certainly higher. #LaTeX #expl3 #programming #TeXLaTeX
Explcheck v0.13.0 introduces inter-file dependency analysis, segment representation, and code coverage reporting 馃殌 Another milestone towards flow analysis!
https://witiko.github.io/Expl3-Linter-11/ #LaTeX #expl3 #programming #TeXLaTeX
Static analysis of expl3 programs (11): Inter-file dependencies, segments, and code coverage

Today, I鈥檓 excited to release the next major update to expltools, a bundle that includes the static analysis tool explcheck for the expl3 programming language. This update improves upon the semantic analysis processing step introduced in the previous post and lays groundwork for the final processing step of flow analysis.

Explcheck v0.12.0 adds supports for 16 new issues, finishing semantic analysis! For more details, see https://witiko.github.io/Expl3-Linter-9/. #LaTeX #expl3 #programming #TeXLaTeX
Static analysis of expl3 programs (9): Semantic analysis

Today, I鈥檓 excited to release the next major update to expltools, a bundle that includes the static analysis tool explcheck for the expl3 programming language. This update finishes the semantic analysis, completing four out of five planned processing steps.

My first attempt at formalizing expl3's type system in explcheck fits onto just 74 lines of Lua code and seems to work OK. #LaTeX #expl3 #programming #TeXLaTeX