CTAN update: expltools
Date: May 5, 2026 12:07:51 PM CEST
Vít Starý Novotný submitted an update to the
expltools
package.
Version: 2026-05-03
License: lppl1.3c gpl2+
Summary description: Development tools for expl3 programmers
Announcement text:
## expltools 2026-05-03 ### explcheck v0.20.0 #### New features This version of explcheck has implemented the following new features: - Add more support for flow analysis. (#188) This adds support for the following issues from the document titled [_Warnings and errors for the expl3 analysis tool_][warnings-and-errors]: 1. E428 (Unexpandable or restricted-expandable boolean expression) 1. W429 (Defined an unexpandable function as unprotected) 2. W502 (Unused private function) 3. W503 (Unused private function variant) Out of these issues, warning W429 is particularly pervasive, being reported for 573 package files in TeX Live 2025. - In `explcheck-latex3.lua`, add `definitions["function"]` and `definitions.variable` properties with LPEG parsers that accept LaTeX3 standard-library function and variable names, respectively, and capture their properties, such as expandability and the date when they were added or most recently updated. (#201, co-authored by @josephwright in latex3/latex3#1885 and latex3/latex3#1886) For example, `lpeg.match(definitions["function"], "msg_expandable_error:nn")`, where `definitions = require("explcheck-latex3").definitions`, returns the Lua table `{ EXP = "full", added = "2015-08-06" }`. These parsers are generated by `generate-explcheck-latex3.lua` from a new third-party submodule at `third-party/latex3`, which points to a reasonably recent version of the LaTeX3 development repository. At commit latex3/latex3@ff6927ae8, the parsers recognize 4,850 LaTeX3 standard-library functions and 339 variables. - Support multiple user config files being specified in the command-line option `--config-file` and the corresponding Lua option `config_file`. (discussed with @muzimuzhi in #203, added in #201) - Add Lua option `defined_csnames` that specifies which control sequences should always be assumed to be defined. (discussed with @muzimuzhi and @alceu-frigeri in #206, added in #201) This option provides a more fine-grained alternative to the earlier `imported_prefixes`. For example, suppose the control sequences `\module_foo:` and `\module_bar:` are imported and should always be considered defined. A coarse-grained way to express this is: ``` toml [defaults] imported_prefixes = ["module"] ``` However, this also suppresses warnings and errors for all control sequence names matching `\module_*`, as well as message names matching `module/*`, which may be undesirable. Using `defined_csnames`, the same intent can be expressed more precisely: ``` toml [defaults] defined_csnames = ["module_foo:", "module_bar:"] ``` This way, only warnings and errors related to the listed control sequence names are suppressed. - Add Lua option `latex3_definitions_max_added_date`, which limits how recent LaTeX3 standard-library function and variable definitions are considered during analysis. (#201) This affects issues E428 and E508 (Unexpandable or restricted-expandable boolean expression) and W429 and W512 (Defined an unexpandable function as unprotected), as well as any issues that are only reported for user-defined functions and variables, not for LaTeX3 standard-library ones. For example, your config file `.explcheckrc` might look as follows if you want to only consider deprecations, prefixes, and definitions from TeX Live 2025 and earlier: ``` toml [defaults] l3obsolete_max_deprecated_date = "2025-09-29" l3prefixes_max_first_registered_date = "2025-12-02" latex3_definitions_max_added_date = "2025-07-08" ``` These dates can be obtained by running `generate-explcheck-latex3.lua` with the Git submodule `third-party/latex3` checked out at a commit corresponding to TeX Live 2025. One reasonable approximation is the Git tag `2026-01-19`, since `/usr/local/texlive/2025/texmf-dist/tex/latex/l3kernel/expl3-code.tex` in the Docker image `texlive/texlive:TL2025-historic` contains `\def\ExplFileDate{2026-01-19}`. The script then produces output such as: ``` LPEG parsers and other information extracted from LaTeX3 data files. Generated on 2026-04-30 from the following files: - "l3obsolete.txt" with the latest obsolete entry from 2025-09-29: `\l_keys_choice_tl` - "l3prefixes.csv" with the latest registered prefix from 2025-12-02: "asmejour" - 85 "l3*.dtx" files with 4,753 function and 340 variable definitions: - Latest added function or variable from 2025-07-08: `\tl_retokenize:n` - Latest updated function or variable from 2025-09-29: `\l_keys_choice_int` ``` #### Warnings and errors This version of explcheck has made the following changes to the document titled [_Warnings and errors for the expl3 analysis tool_][warnings-and-errors]: - Remove planned issues E509 (Expanding an unexpandable function) and E510 (Fully-expanding a restricted-expandable function), since none of these constitute an error: the functions simply remain unexpanded. (#201) - Plan for weaker versions of the issues E508 (Unexpandable or restricted-expandable boolean expression) and W512 (Defined an unexpandable function as unprotected) in semantic analysis under the identifiers E428 and W429, respectively, and the same names. (#201) - Plan for further analysis of integer expressions in Section "Caveats". (#201) #### Continuous integration This version of explcheck has made the following changes to our continuous integration: - Bump `softprops/action-gh-release` from 2 to 3. (contributed by @dependabot in #199) - Check that third-party submodules are up-to-date. (#201) [warnings-and-errors]: https://github.com/witiko/expltools/releases/download/latest/warnings-and-errors.pdf
This package is located at https://mirrors.ctan.org/support/expltools More information is at https://ctan.org/pkg/expltools
Thanks for the upload. For the CTAN Team Manfred Lotz CTAN is run entirely by volunteers and supported by TeX user groups. Please join a user group or donate to one, see https://ctan.org/lugs .
## expltools 2026-05-03 ### explcheck v0.20.0 #### New features This version of explcheck has implemented the following new features: - Add more support for flow analysis. (#188) This adds support for the following issues from the document titled [_Warnings and errors for the expl3 analysis tool_][warnings-and-errors]: 1. E428 (Unexpandable or restricted-expandable boolean expression) 1. W429 (Defined an unexpandable function as unprotected) 2. W502 (Unused private function) 3. W503 (Unused private function variant) Out of these issues, warning W429 is particularly pervasive, being reported for 573 package files in TeX Live 2025. - In `explcheck-latex3.lua`, add `definitions["function"]` and `definitions.variable` properties with LPEG parsers that accept LaTeX3 standard-library function and variable names, respectively, and capture their properties, such as expandability and the date when they were added or most recently updated. (#201, co-authored by @josephwright in latex3/latex3#1885 and latex3/latex3#1886) For example, `lpeg.match(definitions["function"], "msg_expandable_error:nn")`, where `definitions = require("explcheck-latex3").definitions`, returns the Lua table `{ EXP = "full", added = "2015-08-06" }`. These parsers are generated by `generate-explcheck-latex3.lua` from a new third-party submodule at `third-party/latex3`, which points to a reasonably recent version of the LaTeX3 development repository. At commit latex3/latex3@ff6927ae8, the parsers recognize 4,850 LaTeX3 standard-library functions and 339 variables. - Support multiple user config files being specified in the command-line option `--config-file` and the corresponding Lua option `config_file`. (discussed with @muzimuzhi in #203, added in #201) - Add Lua option `defined_csnames` that specifies which control sequences should always be assumed to be defined. (discussed with @muzimuzhi and @alceu-frigeri in #206, added in #201) This option provides a more fine-grained alternative to the earlier `imported_prefixes`. For example, suppose the control sequences `\module_foo:` and `\module_bar:` are imported and should always be considered defined. A coarse-grained way to express this is: ``` toml [defaults] imported_prefixes = ["module"] ``` However, this also suppresses warnings and errors for all control sequence names matching `\module_*`, as well as message names matching `module/*`, which may be undesirable. Using `defined_csnames`, the same intent can be expressed more precisely: ``` toml [defaults] defined_csnames = ["module_foo:", "module_bar:"] ``` This way, only warnings and errors related to the listed control sequence names are suppressed. - Add Lua option `latex3_definitions_max_added_date`, which limits how recent LaTeX3 standard-library function and variable definitions are considered during analysis. (#201) This affects issues E428 and E508 (Unexpandable or restricted-expandable boolean expression) and W429 and W512 (Defined an unexpandable function as unprotected), as well as any issues that are only reported for user-defined functions and variables, not for LaTeX3 standard-library ones. For example, your config file `.explcheckrc` might look as follows if you want to only consider deprecations, prefixes, and definitions from TeX Live 2025 and earlier: ``` toml [defaults] l3obsolete_max_deprecated_date = "2025-09-29" l3prefixes_max_first_registered_date = "2025-12-02" latex3_definitions_max_added_date = "2025-07-08" ``` These dates can be obtained by running `generate-explcheck-latex3.lua` with the Git submodule `third-party/latex3` checked out at a commit corresponding to TeX Live 2025. One reasonable approximation is the Git tag `2026-01-19`, since `/usr/local/texlive/2025/texmf-dist/tex/latex/l3kernel/expl3-code.tex` in the Docker image `texlive/texlive:TL2025-historic` contains `\def\ExplFileDate{2026-01-19}`. The script then produces output such as: ``` LPEG parsers and other information extracted from LaTeX3 data files. Generated on 2026-04-30 from the following files: - "l3obsolete.txt" with the latest obsolete entry from 2025-09-29: `\l_keys_choice_tl` - "l3prefixes.csv" with the latest registered prefix from 2025-12-02: "asmejour" - 85 "l3*.dtx" files with 4,753 function and 340 variable definitions: - Latest added function or variable from 2025-07-08: `\tl_retokenize:n` - Latest updated function or variable from 2025-09-29: `\l_keys_choice_int` ``` #### Warnings and errors This version of explcheck has made the following changes to the document titled [_Warnings and errors for the expl3 analysis tool_][warnings-and-errors]: - Remove planned issues E509 (Expanding an unexpandable function) and E510 (Fully-expanding a restricted-expandable function), since none of these constitute an error: the functions simply remain unexpanded. (#201) - Plan for weaker versions of the issues E508 (Unexpandable or restricted-expandable boolean expression) and W512 (Defined an unexpandable function as unprotected) in semantic analysis under the identifiers E428 and W429, respectively, and the same names. (#201) - Plan for further analysis of integer expressions in Section "Caveats". (#201) #### Continuous integration This version of explcheck has made the following changes to our continuous integration: - Bump `softprops/action-gh-release` from 2 to 3. (contributed by @dependabot in #199) - Check that third-party submodules are up-to-date. (#201) [warnings-and-errors]: https://github.com/witiko/expltools/releases/download/latest/warnings-and-errors.pdf
This package is located at https://mirrors.ctan.org/support/expltools More information is at https://ctan.org/pkg/expltools
Thanks for the upload. For the CTAN Team Manfred Lotz CTAN is run entirely by volunteers and supported by TeX user groups. Please join a user group or donate to one, see https://ctan.org/lugs .
expltools – Development tools for expl3 programmers
This bundle introduces explcheck, a static analysis tool for developers working with expl3 code. Currently in its initial release, explcheck aims to help developers identify potential issues and improve code quality. In the future, this bundle may expand to include additional development tools for expl3.
| Package | expltools |
| Version | 2026-05-03 |
| Copyright | 2024–2026 Vít Starý Novotný |
| Maintainer | Vít Starý Novotný |