The first in a series of devlogs about the development of a linter for the expl3 programming language. 🚀 https://witiko.github.io/Expl3-Linter-1/ @TeXhackse
Static analysis of expl3 programs (1): Introduction

In 2021, I used the expl3 programming language for the first time in my life. I had already been eyeing expl3 for some time and when it came to defining a LaTeX-specific interface for processing YAML metadata in version 2.11.0 of the Markdown Package for TeX, I took the plunge.

The second in a series of devlogs about the development of a linter for the expl3 programming language. 🚀 https://witiko.github.io/Expl3-Linter-2/ @TeXhackse
Static analysis of expl3 programs (2): Requirements

This is my second devlog post for the development of a static analysis tool (so-called linter) for the expl3 programming language, which would help developers to discover bugs in their expl3 programs before even running them.

@TeXhackse The second-and-a-half in a series of devlogs about the development of a linter for the expl3 programming language. 🦆 https://witiko.github.io/Expl3-Linter-2.5/
Static analysis of expl3 programs (2½): Status update and TeX language servers

Between family holiday, my wife’s trip to Кыргызстан, freelance work, and TUG 2024, I have had precious little time for the project since my previous post.

@TeXhackse My third devlog about the development of an expl3 linter reviews the related work in the analysis of (La)TeX programs and documents. Find out about useful tools that you can insert into your CI pipeline to nag you and make your documents better! https://witiko.github.io/Expl3-Linter-3/ 🤯
Static analysis of expl3 programs (3): Related work

This is my third devlog post for the development of a static analysis tool (so-called linter) for the expl3 programming language, which would help developers to discover bugs in their expl3 programs before even running them.

@TeXhackse My fourth devlog about the development of an expl3 linter outlines the linter's design and creates a code repository at https://github.com/witiko/expltools. Feedback on the design is appreciated. In the next post, I will code the first processing step for the linter. https://witiko.github.io/Expl3-Linter-4
GitHub - Witiko/expltools: Development tools for expl3 programmers

Development tools for expl3 programmers. Contribute to Witiko/expltools development by creating an account on GitHub.

GitHub
On September 6, the Development Fund of @TeXUsersGroup has decided to support the development of the expl3 linter over the next 12 months! 🎉 https://tug.org/tc/devfund/grants.html
Grants Awarded - TeX Development Fund

A monthly status update for the development of the expl3 linter. https://witiko.github.io/Expl3-Linter-4.5/
Static analysis of expl3 programs (4½): Status update

In September, I wrote a project proposal for developing a static analysis tool (so-called linter) for the expl3 programming language. I submitted the proposal to the TeX Development Fund and I’m thrilled to share that the proposal has been accepted. The project was awarded a grant of US$2000, spread over the next 12 months. At the end of this period, I’ll be presenting a final report as a TUGboat article, potentially as early as at TUG 2025 in तिरुवनन्तपुरम्.

Exciting week for the TeX/LaTeX community in Brno! Frank Mittelbach visited Masaryk University, and I launched the first public release of explcheck, a static analysis tool for expl3—now live on CTAN! 🎉 https://witiko.github.io/Expl3-Linter-5/ https://ctan.org/pkg/expltools
Static analysis of expl3 programs (5): Frank Mittelbach in Brno, the first public release of explcheck, and expl3 usage statistics

This week has been an exciting one for the TeX and LaTeX community in Brno, with Frank Mittelbach, a key figure from the LaTeX team, visiting Masaryk University to deliver talks on the history and the future of LaTeX. Alongside his visit, I introduced explcheck, a static analysis tool for the expl3 programming language, with its first public release now available on CTAN. As part of my seminar talk, I demonstrated explcheck’s capabilities, including a deep dive into 11 years of expl3 usage statistics, which reveal intriguing trends about its adoption and integration into the TeX ecosystem.

Exciting progress on explcheck! 🎉 Two new releases in two weeks, a third coming Dec 23, and a presentation at CSTUG’s general assembly. Dive into the updates and what’s next for this static analysis tool for expl3! 🔗 https://witiko.github.io/Expl3-Linter-6/ #LaTeX #expl3 #programming
Static analysis of expl3 programs (6): A flurry of releases, CSTUG talk, and what's next

Two weeks ago, I announced the first public release of expltools, a bundle that includes explcheck, a static analysis tool for the expl3 programming language. Since then, the project has sparked a lively discussion in the project repository, engaging early adopters, contributors, and enthusiasts. This feedback loop has already resulted in two new releases within the past two weeks, and another update is planned for next Monday (December 23). On December 14, I also had the opportunity to present explcheck during a talk at the general assembly of the Czechoslovak TeX Users Group (CSTUG). Although the talk was delivered in Czech, the presentation slides are in English and should provide a clear overview of the topics discussed.

The latest release of #explcheck, v0.6.0 (2025-01-16), supports 2/5 planned processing stages, and can be configured via TOML or inline expl3 comments. It’s now on CTAN—give it a try! #LaTeX #TeXLaTeX #expl3 #programming

Another month and another explcheck update! @koppor and I introduced lexical analysis and launched a public site listing issues in current TeX Live. 🚀

🔗 https://koppor.github.io/explcheck-issues/

More details in my latest blog post:
https://witiko.github.io/Expl3-Linter-7/

#LaTeX #TeXLaTeX #expl3 #programming #TeXLive

expl3 issues

New month, new explcheck update! 🛠️

I've just rolled out syntactic analysis, moving us closer to complete static analysis for expl3 code. We're on track to build a public web library of expl3 symbols (like functions, global variables, and logging messages).

More details in my latest blog post:
https://witiko.github.io/Expl3-Linter-8/

#LaTeX #TeXLaTeX #expl3 #programming

Static analysis of expl3 programs (8): Syntactic analysis

Today, I’m 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 introduces syntactic analysis, completing three out of five planned processing steps.

New month, new explcheck update! 🛠️

This release introduces the first stage of semantic analysis. expl3 function definitions are now analyzed in depth, allowing explcheck to catch more issues inside user-defined code—not just at the top level.

I also report on bugs found in TeX Live packages and how maintainers are responding.

Details in the latest blog post:
https://witiko.github.io/Expl3-Linter-8.5/

#LaTeX #TeXLaTeX #expl3 #programming

Static analysis of expl3 programs (8½): First stages of semantic analysis and working with the community

Today, I’m excited to announce another update to expltools, the bundle that includes the static analysis tool explcheck for the expl3 programming language. This update introduces initial support for semantic analysis. In this post, I’ll explain what this means for expl3 programmers, what’s still missing, and where we’re headed next. In a previous post, I introduced a public website listing issues in current TeX Live packages detected by explcheck. This time, I’ll also talk about how I’ve been using that resource to collaborate with package authors and help fix real-world issues.

🔍 Deeper semantic analysis for explcheck!

The latest update adds six new checks for expl3 functions and variants, catching more subtle bugs and edge cases. This completes a quarter of all checks planned for the semantic analysis step.

I also take a hard look at the project timeline—why things are slower than expected, and what comes next.

Read the full devlog here:
https://witiko.github.io/Expl3-Linter-8.75/

#LaTeX #TeXLaTeX #expl3 #programming #devlog

Static analysis of expl3 programs (8¾): Semantic analysis for functions and what's taking so long

Today, I’m excited to announce another update to expltools, the bundle that includes the static analysis tool explcheck for the expl3 programming language. This release significantly extends support for the semantic analysis processing step. In this post, I’ll explain what this means for expl3 programmers, what functionality is still missing, and provide a realistic estimate for when full support for semantic (and flow) analysis can be expected. I’ll also discuss how this impacts the project roadmap. Additionally, I’d like to tease a work-in-progress article titled Expltools: Development tools for expl3 programmers, forthcoming in TUGboat 46(2) or (3), along with my upcoming talk this July at TUG 2025 in India. Finally, as a follow-up to the previous two posts, in which I described how I collaborated with package authors to fix issues detected by explcheck, I’ll provide updates on the status of those tickets.

After today's update of the ghcr.io/witiko/expltools/explcheck docker image, the issue W202 (Deprecated control sequences) is reported for ~46 new package files. This is due to the 2025-06-01 release of LaTeX, which renames `\regex_match:*` to `\regex_if_match:*` and deprecates the former. See also <https://github.com/witiko/expltools/issues/95>.

#LaTeX #TeXLaTeX #expl3 #programming #devlog

Review detection after the latest update of `l3obsolete.txt` · Issue #95 · Witiko/expltools

The regression tests have been failing since the 2025-06-01 LaTeX release, likely because functions \regex_match:* were renamed to \regex_if_match:* and marked as deprecated in file l3obsolete.txt ...

GitHub
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
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’m 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.

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’m 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.

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’s 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.

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

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

The v0.18.2 release of explcheck https://github.com/Witiko/expltools/releases/tag/2026-03-13 speeds up the flow analysis by another order of magnitude, reducing runtimes on corner-case examples from months in v0.18.0 to a little over an hour.

There are still plenty of optimization opportunities for a motivated master's student https://github.com/Witiko/expltools/issues/156 but nothing that can't wait until after v1.0.0. 🚀

#LaTeX #expl3 #programming #TeXLaTeX #expltools #explcheck

Release 2026-03-13 · Witiko/expltools

expltools 2026-03-13 explcheck v0.18.2 Fixes This version of explcheck has fixed the following problems: Support c-type arguments in variable and constants declarations, definitions, and uses. (#...

GitHub

Five new flow-analysis issue types have been added in https://github.com/Witiko/expltools/pull/188 over the past two days:

1. E500 (Multiply defined function)
2. W501 (Multiply defined function variant)
3. E504 (Function variant for an undefined function)
4. E506 (Indirect function definition from an undefined function)
5. W507 (Setting a function before definition)

These will be included in explcheck v0.19.0, planned for release by the end of the month.

#LaTeX #expl3 #programming #TeXLaTeX #expltools

Support flow analysis by Witiko · Pull Request #188 · Witiko/expltools

This PR continues #176 based on the tasks outlined there and the recent blog post: Report issues from Section 5.1 (Functions and conditional functions) from the document titled Warnings and error...

GitHub