texlive[74808] Master/texmf-dist: expltools (1apr25)

commits+karl at tug.org commits+karl at tug.org
Tue Apr 1 21:56:40 CEST 2025


Revision: 74808
          https://tug.org/svn/texlive?view=revision&revision=74808
Author:   karl
Date:     2025-04-01 21:56:40 +0200 (Tue, 01 Apr 2025)
Log Message:
-----------
expltools (1apr25)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/support/expltools/CHANGES.md
    trunk/Master/texmf-dist/doc/support/expltools/README.md
    trunk/Master/texmf-dist/doc/support/expltools/project-proposal.pdf
    trunk/Master/texmf-dist/doc/support/expltools/warnings-and-errors.pdf
    trunk/Master/texmf-dist/scripts/expltools/explcheck-cli.lua
    trunk/Master/texmf-dist/scripts/expltools/explcheck-config.toml
    trunk/Master/texmf-dist/scripts/expltools/explcheck-evaluation.lua
    trunk/Master/texmf-dist/scripts/expltools/explcheck-format.lua
    trunk/Master/texmf-dist/scripts/expltools/explcheck-lexical-analysis.lua
    trunk/Master/texmf-dist/scripts/expltools/explcheck-obsolete.lua
    trunk/Master/texmf-dist/scripts/expltools/explcheck-parsers.lua

Modified: trunk/Master/texmf-dist/doc/support/expltools/CHANGES.md
===================================================================
--- trunk/Master/texmf-dist/doc/support/expltools/CHANGES.md	2025-04-01 19:56:22 UTC (rev 74807)
+++ trunk/Master/texmf-dist/doc/support/expltools/CHANGES.md	2025-04-01 19:56:40 UTC (rev 74808)
@@ -1,5 +1,14 @@
 # Changes
 
+## expltools 2025-04-01
+
+### explcheck v0.8.1
+
+#### Fixes
+
+- Be more precise in detecting non-expl3 control sequences in expl3 parts.
+  (reported by @callegar in #72, fixed in #74)
+
 ## expltools 2025-03-27
 
 ### explcheck v0.8.0
@@ -21,13 +30,13 @@
   ```
   Checking 2 files
 
-  Checking /usr/local/texlive/2024/texmf-dist/tex/generic/markdown/markdown.tex OK
+  Checking /usr/local/texlive/2024/texmf-dist/tex/generic/markdown/markdown.tex        OK
 
       File size: 103,972 bytes
 
       Preprocessing results:
       - Doesn't seem like a LaTeX style file
-      - Six expl3 parts spanning 97,657 bytes (94% of file):
+      - Six expl3 parts spanning 97,657 bytes (94% of file size):
           1. Between 48:14 and 620:11
           2. Between 637:14 and 788:4
           3. Between 791:14 and 2104:8
@@ -36,18 +45,19 @@
           6. Between 4287:14 and 4444:4
 
       Lexical analysis results:
-      - 19,344 TeX tokens in expl3 parts
+      - 19,344 tokens in expl3 parts
+      - 1,598 groupings in expl3 parts
 
       Syntactic analysis results:
       - 645 top-level expl3 calls spanning all tokens
 
-  Checking /.../tex/latex/markdown/markdownthemewitiko_markdown_defaults.sty    OK
+  Checking /.../tex/latex/markdown/markdownthemewitiko_markdown_defaults.sty           OK
 
       File size: 34,894 bytes
 
       Preprocessing results:
       - Seems like a LaTeX style file
-      - Seven expl3 parts spanning 18,515 bytes (53% of file):
+      - Seven expl3 parts spanning 18,515 bytes (53% of file size):
           1. Between 47:14 and 349:4
           2. Between 382:14 and 431:2
           3. Between 446:14 and 512:4
@@ -57,17 +67,18 @@
           7. Between 1072:14 and 1328:2
 
       Lexical analysis results:
-      - 3,848 TeX tokens in expl3 parts
+      - 3,848 tokens in expl3 parts
+      - 366 groupings in expl3 parts
 
       Syntactic analysis results:
-      - 69 top-level expl3 calls spanning 2,082 tokens (54% of tokens, ~29% of file)
+      - 69 top-level expl3 calls spanning 2,082 tokens (54% of tokens, ~29% of file size)
 
   Total: 0 errors, 0 warnings in 2 files
 
   Aggregate statistics:
   - 138,866 total bytes
-  - 116,172 expl3 bytes (84% of files) containing 23,192 TeX tokens
-  - 714 top-level expl3 calls spanning 21,426 tokens (92% of tokens, ~77% of files)
+  - 116,172 expl3 bytes (84% of total bytes) containing 23,192 tokens and 1,964 groupings
+  - 714 top-level expl3 calls spanning 21,426 tokens (92% of tokens, ~77% of total bytes)
   ```
 
 - Add Lua option `terminal_width` that determines the layout of the

Modified: trunk/Master/texmf-dist/doc/support/expltools/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/support/expltools/README.md	2025-04-01 19:56:22 UTC (rev 74807)
+++ trunk/Master/texmf-dist/doc/support/expltools/README.md	2025-04-01 19:56:40 UTC (rev 74808)
@@ -15,6 +15,7 @@
 5. [Frank Mittelbach in Brno, first public release of explcheck, and expl3 usage statistics][8] from Dec 5, 2024
 6. [A flurry of releases, CSTUG talk, and what's next][9] from December 19, 2024
 7. [Lexical analysis and a public website listing issues in current TeX Live][12] from February 24, 2025
+8. [Syntactic analysis][13] from March 27, 2025
 
 In the future, this repository may also contain the code of other useful development tools for expl3 programmers, such as a command-line utility similar to `grep` that will ignore whitespaces and newlines as well as other tools.
 
@@ -30,6 +31,7 @@
  [10]: https://github.com/witiko/expltools/releases/download/latest/warnings-and-errors.pdf
  [11]: https://koppor.github.io/explcheck-issues/
  [12]: https://witiko.github.io/Expl3-Linter-7/
+ [13]: https://witiko.github.io/Expl3-Linter-8/
 
 ## Usage
 
@@ -147,6 +149,8 @@
 
 The file `explcheck.lua` should be installed in the TDS directory `scripts/expltools/explcheck`. Furthermore, it should be made executable and either symlinked to system directories as `explcheck` on Unix or have a wrapper `explcheck.exe` installed on Windows.
 
+The files `explcheck-config.lua` and `explcheck-config.toml` must be installed in the same directory.
+
 ## Authors
 
 - Vít Starý Novotný (<witiko at mail.muni.cz>)

Modified: trunk/Master/texmf-dist/doc/support/expltools/project-proposal.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/support/expltools/warnings-and-errors.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/scripts/expltools/explcheck-cli.lua
===================================================================
--- trunk/Master/texmf-dist/scripts/expltools/explcheck-cli.lua	2025-04-01 19:56:22 UTC (rev 74807)
+++ trunk/Master/texmf-dist/scripts/expltools/explcheck-cli.lua	2025-04-01 19:56:40 UTC (rev 74808)
@@ -162,7 +162,7 @@
 end
 
 local function print_version()
-  print("explcheck (expltools 2025-03-27) v0.8.0")
+  print("explcheck (expltools 2025-04-01) v0.8.1")
   print("Copyright (c) 2024-2025 Vít Starý Novotný")
   print("Licenses: LPPL 1.3 or later, GNU GPL v2 or later")
 end

Modified: trunk/Master/texmf-dist/scripts/expltools/explcheck-config.toml
===================================================================
--- trunk/Master/texmf-dist/scripts/expltools/explcheck-config.toml	2025-04-01 19:56:22 UTC (rev 74807)
+++ trunk/Master/texmf-dist/scripts/expltools/explcheck-config.toml	2025-04-01 19:56:40 UTC (rev 74808)
@@ -198,6 +198,7 @@
 
 [filename."denisbdoc.sty"]
 expl3_detection_strategy = "always"
+ignored_issues = ["e201"]
 
 [package.whatsnote]
 expl3_detection_strategy = "always"
@@ -265,3 +266,9 @@
 
 [package.zitie]
 ignored_issues = ["e300"]
+
+[filename."spreadtab.sty"]
+expl3_detection_strategy = "never"
+
+[filename."ecgdraw.sty"]
+ignored_issues = ["e201"]

Modified: trunk/Master/texmf-dist/scripts/expltools/explcheck-evaluation.lua
===================================================================
--- trunk/Master/texmf-dist/scripts/expltools/explcheck-evaluation.lua	2025-04-01 19:56:22 UTC (rev 74807)
+++ trunk/Master/texmf-dist/scripts/expltools/explcheck-evaluation.lua	2025-04-01 19:56:40 UTC (rev 74808)
@@ -34,6 +34,18 @@
       num_tokens = num_tokens + #part_tokens
     end
   end
+  local num_groupings, num_unclosed_groupings
+  if analysis_results.groupings ~= nil then
+    num_groupings, num_unclosed_groupings = 0, 0
+    for _, part_groupings in ipairs(analysis_results.groupings) do
+      for _, grouping in pairs(part_groupings) do
+        num_groupings = num_groupings + 1
+        if grouping.stop == nil then
+          num_unclosed_groupings = num_unclosed_groupings + 1
+        end
+      end
+    end
+  end
   -- Evaluate the results of the syntactic analysis.
   local num_calls, num_call_tokens
   if analysis_results.calls ~= nil then
@@ -54,6 +66,8 @@
   self.num_errors = num_errors
   self.num_expl_bytes = num_expl_bytes
   self.num_tokens = num_tokens
+  self.num_groupings = num_groupings
+  self.num_unclosed_groupings = num_unclosed_groupings
   self.num_calls = num_calls
   self.num_call_tokens = num_call_tokens
   return self
@@ -72,6 +86,8 @@
   self.num_errors = 0
   self.num_expl_bytes = 0
   self.num_tokens = 0
+  self.num_groupings = 0
+  self.num_unclosed_groupings = 0
   self.num_calls = 0
   self.num_call_tokens = 0
   return self
@@ -80,21 +96,11 @@
 -- Add evaluation results of an individual file to the aggregate.
 function AggregateEvaluationResults:add(evaluation_results)
   self.num_files = self.num_files + 1
-  self.num_total_bytes = self.num_total_bytes + evaluation_results.num_total_bytes
-  self.num_warnings = self.num_warnings + evaluation_results.num_warnings
-  self.num_errors = self.num_errors + evaluation_results.num_errors
-  if evaluation_results.num_expl_bytes ~= nil then
-    self.num_expl_bytes = self.num_expl_bytes + evaluation_results.num_expl_bytes
+  for key, _ in pairs(self) do
+    if key ~= "num_files" and evaluation_results[key] ~= nil then
+      self[key] = self[key] + evaluation_results[key]
+    end
   end
-  if evaluation_results.num_tokens ~= nil then
-    self.num_tokens = self.num_tokens + evaluation_results.num_tokens
-  end
-  if evaluation_results.num_calls ~= nil then
-    self.num_calls = self.num_calls + evaluation_results.num_calls
-  end
-  if evaluation_results.num_call_tokens ~= nil then
-    self.num_call_tokens = self.num_call_tokens + evaluation_results.num_call_tokens
-  end
 end
 
 return {

Modified: trunk/Master/texmf-dist/scripts/expltools/explcheck-format.lua
===================================================================
--- trunk/Master/texmf-dist/scripts/expltools/explcheck-format.lua	2025-04-01 19:56:22 UTC (rev 74807)
+++ trunk/Master/texmf-dist/scripts/expltools/explcheck-format.lua	2025-04-01 19:56:40 UTC (rev 74808)
@@ -127,7 +127,12 @@
     return "100%"
   else
     assert(denominator > 0)
-    return string.format("%.0f%%", 100.0 * numerator / denominator)
+    local formatted_percentage = string.format("%.0f%%", 100.0 * numerator / denominator)
+    if numerator > 0 and formatted_percentage == "0%" then
+      return ">0%"
+    else
+      return formatted_percentage
+    end
   end
 end
 
@@ -168,13 +173,22 @@
       goto skip_remaining_additional_information
     end
     io.write(string.format("\n- %s expl3 %s ", titlecase(humanize(num_expl_bytes)), pluralize("byte", num_expl_bytes)))
-    io.write(string.format("(%s of %s)", format_ratio(num_expl_bytes, num_total_bytes), pluralize("file", num_files)))
+    io.write(string.format("(%s of total bytes)", format_ratio(num_expl_bytes, num_total_bytes)))
     -- Evaluate the evalution results of the lexical analysis.
     local num_tokens = evaluation_results.num_tokens
     if num_tokens == 0 then
       goto skip_remaining_additional_information
     end
-    io.write(string.format(" containing %s %s", humanize(num_tokens), pluralize("TeX token", num_tokens)))
+    io.write(string.format(" containing %s %s", humanize(num_tokens), pluralize("token", num_tokens)))
+    local num_groupings = evaluation_results.num_groupings
+    if num_groupings > 0 then
+      io.write(string.format(" and %s %s", humanize(num_groupings), pluralize("grouping", num_groupings)))
+      local num_unclosed_groupings = evaluation_results.num_unclosed_groupings
+      if num_unclosed_groupings > 0 then
+        local formatted_grouping_ratio = format_ratio(num_unclosed_groupings, num_groupings)
+        io.write(string.format(" (%s unclosed, %s of groupings)", humanize(num_unclosed_groupings), formatted_grouping_ratio))
+      end
+    end
     -- Evaluate the evalution results of the syntactic analysis.
     local num_calls = evaluation_results.num_calls
     local num_call_tokens = evaluation_results.num_call_tokens
@@ -189,7 +203,7 @@
       io.write(string.format("%s %s ", humanize(num_call_tokens), pluralize("token", num_call_tokens)))
       local formatted_token_ratio = format_ratio(num_call_tokens, num_tokens)
       local formatted_byte_ratio = format_ratio(num_expl_bytes * num_call_tokens, num_total_bytes * num_tokens)
-      io.write(string.format("(%s of tokens, ~%s of %s)", formatted_token_ratio, formatted_byte_ratio, pluralize("file", num_files)))
+      io.write(string.format("(%s of tokens, ~%s of total bytes)", formatted_token_ratio, formatted_byte_ratio))
     end
   end
 
@@ -411,7 +425,7 @@
     else
       local formatted_expl_bytes = string.format("%s %s", humanize(num_expl_bytes), pluralize("byte", num_expl_bytes))
       local formatted_expl_ratio = format_ratio(num_expl_bytes, num_total_bytes)
-      io.write(string.format("%s (%s of file)", formatted_expl_bytes, formatted_expl_ratio))
+      io.write(string.format("%s (%s of file size)", formatted_expl_bytes, formatted_expl_ratio))
     end
     if not (#expl_ranges == 1 and #expl_ranges[1] == num_total_bytes) then
       io.write(":")
@@ -428,10 +442,21 @@
     io.write(string.format("\n\n%s%s", line_indent, colorize("Lexical analysis results:", BOLD)))
     local num_tokens = evaluation_results.num_tokens
     if num_tokens == 0 or num_tokens == nil then
-      io.write(string.format("\n%s- No TeX tokens in expl3 parts", line_indent))
+      io.write(string.format("\n%s- No tokens in expl3 parts", line_indent))
       goto skip_remaining_additional_information
     end
-    io.write(string.format("\n%s- %s %s in expl3 parts", line_indent, titlecase(humanize(num_tokens)), pluralize("TeX token", num_tokens)))
+    io.write(string.format("\n%s- %s %s in expl3 parts", line_indent, titlecase(humanize(num_tokens)), pluralize("token", num_tokens)))
+    local num_groupings = evaluation_results.num_groupings
+    if num_groupings ~= nil and num_groupings > 0 then
+      io.write(string.format("\n%s- %s %s", line_indent, titlecase(humanize(num_groupings)), pluralize("grouping", num_groupings)))
+      io.write(" in expl3 parts")
+      local num_unclosed_groupings = evaluation_results.num_unclosed_groupings
+      assert(num_unclosed_groupings ~= nil)
+      if num_unclosed_groupings > 0 then
+        local formatted_grouping_ratio = format_ratio(num_unclosed_groupings, num_groupings)
+        io.write(string.format(" (%s unclosed, %s of groupings)", humanize(num_unclosed_groupings), formatted_grouping_ratio))
+      end
+    end
     -- Evaluate the evalution results of the syntactic analysis.
     io.write(string.format("\n\n%s%s", line_indent, colorize("Syntactic analysis results:", BOLD)))
     local num_calls = evaluation_results.num_calls
@@ -450,7 +475,7 @@
       local formatted_call_tokens = string.format("%s %s", humanize(num_call_tokens), pluralize("token", num_call_tokens))
       local formatted_token_ratio = format_ratio(num_call_tokens, num_tokens)
       local formatted_byte_ratio = format_ratio(num_expl_bytes * num_call_tokens, num_total_bytes * num_tokens)
-      io.write(string.format("%s (%s of tokens, ~%s of file)", formatted_call_tokens, formatted_token_ratio, formatted_byte_ratio))
+      io.write(string.format("%s (%s of tokens, ~%s of file size)", formatted_call_tokens, formatted_token_ratio, formatted_byte_ratio))
     end
   end
 

Modified: trunk/Master/texmf-dist/scripts/expltools/explcheck-lexical-analysis.lua
===================================================================
--- trunk/Master/texmf-dist/scripts/expltools/explcheck-lexical-analysis.lua	2025-04-01 19:56:22 UTC (rev 74807)
+++ trunk/Master/texmf-dist/scripts/expltools/explcheck-lexical-analysis.lua	2025-04-01 19:56:40 UTC (rev 74808)
@@ -136,7 +136,7 @@
           if (
                 catcode ~= 0 and catcode ~= 1 and catcode ~= 2  -- for a control sequence or begin/end grouping, we handle this elsewhere
                 -- do not require whitespace after non-expl3 control sequences or control sequences with empty or one-character names
-                and (previous_catcode ~= 0 or #previous_csname > 1 and lpeg.match(parsers.non_expl3_csname, previous_csname) == nil)
+                and (previous_catcode ~= 0 or #previous_csname > 1 and lpeg.match(parsers.expl3like_csname, previous_csname) ~= nil)
                 and (previous_catcode ~= 0 or character ~= ",")  -- allow a comma after a control sequence without whitespace in between
                 and (previous_catcode ~= 1 or catcode ~= 6)  -- allow a parameter after begin grouping without whitespace in between
                 and (previous_catcode ~= 2 or character ~= ",")  -- allow a comma after end grouping without whitespace in between
@@ -177,7 +177,7 @@
           if (
                 previous_catcode ~= 9 and previous_catcode ~= 10  -- a potential missing stylistic whitespace
                 -- do not require whitespace before non-expl3 control sequences or control sequences with empty or one-character names
-                and #csname > 1 and lpeg.match(parsers.non_expl3_csname, csname) == nil
+                and #csname > 1 and lpeg.match(parsers.expl3like_csname, csname) ~= nil
               ) then
             issues:add('s204', 'missing stylistic whitespaces', range)
           end
@@ -226,7 +226,7 @@
             if (
                     previous_catcode ~= 9 and previous_catcode ~= 10  -- a potential missing stylistic whitespace
                     -- do not require whitespace after non-expl3 control sequences or control sequences with empty or one-character names
-                    and (previous_catcode ~= 0 or #previous_csname > 1 and lpeg.match(parsers.non_expl3_csname, previous_csname) == nil)
+                    and (previous_catcode ~= 0 or #previous_csname > 1 and lpeg.match(parsers.expl3like_csname, previous_csname) ~= nil)
                     and (previous_catcode ~= 1 or catcode ~= 2)  -- allow an end grouping immediately after begin grouping
                     and (previous_catcode ~= 6 or catcode ~= 1 and catcode ~= 2)  -- allow a parameter immediately before grouping
                 ) then
@@ -296,7 +296,7 @@
           if next_token_type == CONTROL_SEQUENCE then
             if (
                   lpeg.match(parsers.expl3_function_assignment_csname, csname) ~= nil
-                  and lpeg.match(parsers.non_expl3_csname, next_csname) == nil
+                  and lpeg.match(parsers.expl3like_csname, next_csname) ~= nil
                   and lpeg.match(parsers.expl3_function_csname, next_csname) == nil
                 ) then
               issues:add('s205', 'malformed function name', next_range)
@@ -303,7 +303,7 @@
             end
             if (
                   lpeg.match(parsers.expl3_variable_or_constant_use_csname, csname) ~= nil
-                  and lpeg.match(parsers.non_expl3_csname, next_csname) == nil
+                  and lpeg.match(parsers.expl3like_csname, next_csname) ~= nil
                   and lpeg.match(parsers.expl3_scratch_variable_csname, next_csname) == nil
                   and lpeg.match(parsers.expl3_variable_or_constant_csname, next_csname) == nil
                 ) then

Modified: trunk/Master/texmf-dist/scripts/expltools/explcheck-obsolete.lua
===================================================================
--- trunk/Master/texmf-dist/scripts/expltools/explcheck-obsolete.lua	2025-04-01 19:56:22 UTC (rev 74807)
+++ trunk/Master/texmf-dist/scripts/expltools/explcheck-obsolete.lua	2025-04-01 19:56:40 UTC (rev 74808)
@@ -9,7 +9,7 @@
 
 -- luacheck: push no max line length
 local obsolete = {}
-obsolete.deprecated_csname = (P("l") * (P("_") * (P("t") * (P("e") * (P("x") * (P("t") * (P("_") * (P("letterlike_tl") + P("accents_tl")))))) + P("k") * (P("e") * (P("y") * (P("s") * (P("_") * (P("path_tl") + P("key_tl")))))))) + P("m") * (P("s") * (P("g") * (P("_") * (P("g") * (P("s") * (P("e") * (P("t") * (P(":") * (P("n") * (P("n") * (P("nn") + P("n")))))))))))) + P("t") * (P("l") * (P("_") * (P("l") * (P("o") * (P("w") * (P("e") * (P("r") * (P("_") * (P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("nn") + P("n")))))))))))) + P("m") * (P("i") * (P("x") * (P("e") * (P("d") * (P("_") * (P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("nn") + P("n")))))))))))) + P("u") * (P("p") * (P("p") * (P("e") * (P("r") * (P("_") * (P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("nn") + P("n")))))))))))) + P("b") * (P("u") * (P("i") * (P("l") * (P("d") * (P("_") * (P("g") * (P("et:NN") + P("clear:N")) + P("clear:N"))))))) + P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("N") * (P("n") * (P("TF") + P("F") + P("T")) + P("n")) + P("c") * (P("n") * (P("TF") + P("F") + P("T")) + P("n"))))))))) + P("e") * (P("x") * (P("t") * (P("_") * (P("t") * (P("i") * (P("t") * (P("l") * (P("e") * (P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("nn") + P("n")))))))))))))))) + P("s") * (P("t") * (P("r") * (P("_") * (P("declare_eight_bit_encoding:nnn") + P("u") * (P("p") * (P("p") * (P("e") * (P("r") * (P("_") * (P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("f") + P("n")))))))))))) + P("f") * (P("o") * (P("l") * (P("d") * (P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("n") + P("V")))))) + P("_") * (P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("n") + P("V"))))))))))) + P("l") * (P("o") * (P("w") * (P("e") * (P("r") * (P("_") * (P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("f") + P("n"))))))))))))))) + P("e") * (P("q") * (P("_") * (P("i") * (P("n") * (P("d") * (P("e") * (P("x") * (P("e") * (P("d") * (P("_") * (P("m") * (P("a") * (P("p") * (P("_") * (P("function:NN") + P("inline:Nn")))))))!
 )))))) + P("set_map_x:NNn") + P("gset_map_x:NNn")))) + P("ys_load_deprecation:")) + P("p") * (P("d") * (P("f") * (P("_") * (P("o") * (P("b") * (P("j") * (P("e") * (P("c") * (P("t") * (P("_") * (P("new:nn") + P("w") * (P("r") * (P("i") * (P("t") * (P("e") * (P(":") * (P("n") * (P("n") + P("x")))))))))))))))))) + P("e") * (P("e") * (P("k") * (P("_") * (P("m") * (P("e") * (P("a") * (P("n") * (P("i") * (P("n") * (P("g") * (P("_") * (P("remove_ignore_spaces:N") + P("ignore_spaces:N"))))))))) + P("c") * (P("h") * (P("a") * (P("r") * (P("c") * (P("o") * (P("d") * (P("e") * (P("_") * (P("remove_ignore_spaces:N") + P("ignore_spaces:N"))))))))) + P("a") * (P("t") * (P("c") * (P("o") * (P("d") * (P("e") * (P("_") * (P("remove_ignore_spaces:N") + P("ignore_spaces:N"))))))))))))) + P("r") * (P("o") * (P("p") * (P("_") * (P("p") * (P("u") * (P("t") * (P("_") * (P("i") * (P("f") * (P("_") * (P("n") * (P("e") * (P("w") * (P(":") * (P("N") * (P("n") * (P("n") + P("V")) + P("Vn")) + P("c") * (P("n") * (P("n") + P("V")) + P("Vn"))))))))))))) + P("g") * (P("p") * (P("u") * (P("t") * (P("_") * (P("i") * (P("f") * (P("_") * (P("n") * (P("e") * (P("w") * (P(":") * (P("N") * (P("n") * (P("n") + P("V")) + P("Vn")) + P("c") * (P("n") * (P("n") + P("V")) + P("Vn"))))))))))))))))))) + P("i") * (P("o") * (P("w") * (P("_") * (P("s") * (P("h") * (P("i") * (P("p") * (P("o") * (P("u") * (P("t") * (P("_") * (P("x") * (P(":") * (P("N") * (P("n") + P("x")) + P("c") * (P("n") + P("x")))))))))))))))) + P("k") * (P("e") * (P("y") * (P("s") * (P("_") * (P("s") * (P("e") * (P("t") * (P("_") * (P("f") * (P("i") * (P("l") * (P("t") * (P("e") * (P("r") * (P(":") * (P("n") * (P("n") * (P("n") * (P("nN") + P("N")) + P("v") * (P("nN") + P("N")) + P("V") * (P("nN") + P("N")) + P("o") * (P("nN") + P("N")) + P("n") + P("V") + P("v") + P("o"))))))))))))))))))) + P("c") * (P("h") * (P("a") * (P("r") * (P("_") * (P("t") * (P("o") * (P("_") * (P("nfd:N") + P("utfviii_bytes:n"))) + P("itlecase:N")) + P("mixed_case:N") + P("f") * (P("o") * (P("l") * (P("d") * (P("cas!
 e:N") + P("_case:N"))))) + P("l") * (P("o") * (P("w") * (P("e") * (P("r") * (P("case:N") + P("_case:N")))))) + P("u") * (P("p") * (P("p") * (P("e") * (P("r") * (P("case:N") + P("_case:N")))))) + P("s") * (P("t") * (P("r") * (P("_") * (P("titlecase:N") + P("mixed_case:N") + P("f") * (P("o") * (P("l") * (P("d") * (P("case:N") + P("_case:N"))))) + P("u") * (P("p") * (P("p") * (P("e") * (P("r") * (P("case:N") + P("_case:N")))))) + P("l") * (P("o") * (P("w") * (P("e") * (P("r") * (P("case:N") + P("_case:N")))))))))))))) + P("s_argument_spec:N"))) * eof
+obsolete.deprecated_csname = (P("p") * (P("d") * (P("f") * (P("_") * (P("o") * (P("b") * (P("j") * (P("e") * (P("c") * (P("t") * (P("_") * (P("new:nn") + P("w") * (P("r") * (P("i") * (P("t") * (P("e") * (P(":") * (P("n") * (P("n") + P("x")))))))))))))))))) + P("e") * (P("e") * (P("k") * (P("_") * (P("m") * (P("e") * (P("a") * (P("n") * (P("i") * (P("n") * (P("g") * (P("_") * (P("remove_ignore_spaces:N") + P("ignore_spaces:N"))))))))) + P("c") * (P("h") * (P("a") * (P("r") * (P("c") * (P("o") * (P("d") * (P("e") * (P("_") * (P("remove_ignore_spaces:N") + P("ignore_spaces:N"))))))))) + P("a") * (P("t") * (P("c") * (P("o") * (P("d") * (P("e") * (P("_") * (P("remove_ignore_spaces:N") + P("ignore_spaces:N"))))))))))))) + P("r") * (P("o") * (P("p") * (P("_") * (P("p") * (P("u") * (P("t") * (P("_") * (P("i") * (P("f") * (P("_") * (P("n") * (P("e") * (P("w") * (P(":") * (P("N") * (P("n") * (P("n") + P("V")) + P("Vn")) + P("c") * (P("n") * (P("n") + P("V")) + P("Vn"))))))))))))) + P("g") * (P("p") * (P("u") * (P("t") * (P("_") * (P("i") * (P("f") * (P("_") * (P("n") * (P("e") * (P("w") * (P(":") * (P("N") * (P("n") * (P("n") + P("V")) + P("Vn")) + P("c") * (P("n") * (P("n") + P("V")) + P("Vn"))))))))))))))))))) + P("i") * (P("o") * (P("w") * (P("_") * (P("s") * (P("h") * (P("i") * (P("p") * (P("o") * (P("u") * (P("t") * (P("_") * (P("x") * (P(":") * (P("N") * (P("n") + P("x")) + P("c") * (P("n") + P("x")))))))))))))))) + P("t") * (P("l") * (P("_") * (P("u") * (P("p") * (P("p") * (P("e") * (P("r") * (P("_") * (P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("nn") + P("n")))))))))))) + P("l") * (P("o") * (P("w") * (P("e") * (P("r") * (P("_") * (P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("nn") + P("n")))))))))))) + P("m") * (P("i") * (P("x") * (P("e") * (P("d") * (P("_") * (P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("nn") + P("n")))))))))))) + P("b") * (P("u") * (P("i") * (P("l") * (P("d") * (P("_") * (P("g") * (P("et:NN") + P("clear:N")) + P("clear:N"))))))) + P("c") * (P("a") * (P("s") * (P(!
 "e") * (P(":") * (P("N") * (P("n") * (P("TF") + P("F") + P("T")) + P("n")) + P("c") * (P("n") * (P("TF") + P("F") + P("T")) + P("n"))))))))) + P("e") * (P("x") * (P("t") * (P("_") * (P("t") * (P("i") * (P("t") * (P("l") * (P("e") * (P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("nn") + P("n")))))))))))))))) + P("s") * (P("t") * (P("r") * (P("_") * (P("declare_eight_bit_encoding:nnn") + P("u") * (P("p") * (P("p") * (P("e") * (P("r") * (P("_") * (P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("f") + P("n")))))))))))) + P("f") * (P("o") * (P("l") * (P("d") * (P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("n") + P("V")))))) + P("_") * (P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("n") + P("V"))))))))))) + P("l") * (P("o") * (P("w") * (P("e") * (P("r") * (P("_") * (P("c") * (P("a") * (P("s") * (P("e") * (P(":") * (P("f") + P("n"))))))))))))))) + P("e") * (P("q") * (P("_") * (P("i") * (P("n") * (P("d") * (P("e") * (P("x") * (P("e") * (P("d") * (P("_") * (P("m") * (P("a") * (P("p") * (P("_") * (P("function:NN") + P("inline:Nn"))))))))))))) + P("set_map_x:NNn") + P("gset_map_x:NNn")))) + P("ys_load_deprecation:")) + P("l") * (P("_") * (P("t") * (P("e") * (P("x") * (P("t") * (P("_") * (P("letterlike_tl") + P("accents_tl")))))) + P("k") * (P("e") * (P("y") * (P("s") * (P("_") * (P("path_tl") + P("key_tl")))))))) + P("m") * (P("s") * (P("g") * (P("_") * (P("g") * (P("s") * (P("e") * (P("t") * (P(":") * (P("n") * (P("n") * (P("nn") + P("n")))))))))))) + P("k") * (P("e") * (P("y") * (P("s") * (P("_") * (P("s") * (P("e") * (P("t") * (P("_") * (P("f") * (P("i") * (P("l") * (P("t") * (P("e") * (P("r") * (P(":") * (P("n") * (P("n") * (P("n") * (P("nN") + P("N")) + P("v") * (P("nN") + P("N")) + P("V") * (P("nN") + P("N")) + P("o") * (P("nN") + P("N")) + P("n") + P("V") + P("v") + P("o"))))))))))))))))))) + P("c") * (P("h") * (P("a") * (P("r") * (P("_") * (P("f") * (P("o") * (P("l") * (P("d") * (P("case:N") + P("_case:N"))))) + P("l") * (P("o") * (P("w") * (P("e") * (P("r") * (P("case:N") + P("_case:N")))))!
 ) + P("t") * (P("o") * (P("_") * (P("nfd:N") + P("utfviii_bytes:n"))) + P("itlecase:N")) + P("mixed_case:N") + P("u") * (P("p") * (P("p") * (P("e") * (P("r") * (P("case:N") + P("_case:N")))))) + P("s") * (P("t") * (P("r") * (P("_") * (P("f") * (P("o") * (P("l") * (P("d") * (P("case:N") + P("_case:N"))))) + P("titlecase:N") + P("mixed_case:N") + P("u") * (P("p") * (P("p") * (P("e") * (P("r") * (P("case:N") + P("_case:N")))))) + P("l") * (P("o") * (P("w") * (P("e") * (P("r") * (P("case:N") + P("_case:N")))))))))))))) + P("s_argument_spec:N"))) * eof
 -- luacheck: pop
 
 return obsolete

Modified: trunk/Master/texmf-dist/scripts/expltools/explcheck-parsers.lua
===================================================================
--- trunk/Master/texmf-dist/scripts/expltools/explcheck-parsers.lua	2025-04-01 19:56:22 UTC (rev 74807)
+++ trunk/Master/texmf-dist/scripts/expltools/explcheck-parsers.lua	2025-04-01 19:56:40 UTC (rev 74808)
@@ -12,7 +12,6 @@
 
 ---- Tokens
 local ampersand = P("&")
-local at_sign = P("@")
 local backslash = P([[\]])
 local circumflex = P("^")
 local colon = P(":")
@@ -262,9 +261,20 @@
   * eof
 )
 
-local non_expl3_csname = (
-  (letter + at_sign)^1
-  * eof
+local expl3like_csname = (
+  underscore^0
+  * letter^1
+  * (
+    underscore  -- a csname with at least one underscore in the middle
+    * (letter + underscore)^1
+    * (
+      colon
+      * letter^0
+    )^-1
+    + (letter + underscore)^0
+    * colon  -- a csname with at least one colon at the end
+    * letter^0
+  )
 )
 
 ---- Comments
@@ -539,6 +549,7 @@
   expl3_endlinechar = expl3_endlinechar,
   expl3_function_assignment_csname = expl3_function_assignment_csname,
   expl3_function_csname = expl3_function_csname,
+  expl3like_csname = expl3like_csname,
   expl3like_material = expl3like_material,
   expl3_quark_or_scan_mark_csname = expl3_quark_or_scan_mark_csname,
   expl3_quark_or_scan_mark_definition_csname = expl3_quark_or_scan_mark_definition_csname,
@@ -552,7 +563,6 @@
   latex_style_file_content = latex_style_file_content,
   linechar = linechar,
   newline = newline,
-  non_expl3_csname = non_expl3_csname,
   n_type_argument_specifier = n_type_argument_specifier,
   N_type_argument_specifier = N_type_argument_specifier,
   parameter_argument_specifier = parameter_argument_specifier,



More information about the tex-live-commits mailing list.