[latex3-commits] [l3svn] 04/04: Add \char_generate:nn

noreply at latex-project.org noreply at latex-project.org
Wed Sep 9 23:10:01 CEST 2015


This is an automated email from the git hooks/post-receive script.

joseph pushed a commit to branch master
in repository l3svn.

commit 6b1fc48920552312a3433765902cb8b1b96e0667
Author: Joseph Wright <joseph.wright at morningstar2.co.uk>
Date:   Wed Sep 9 22:06:24 2015 +0100

    Add \char_generate:nn
    
    This is added as an experimental function and there may well
    be adjustments to make. Notes at present:
    
     - LuaTeX gives 'normal' spaces (charcode 32) for all chars
       requested, so for the present I've disabled making catcode
       10 tokens
     - XeTeX cannot make catcode 13 tokens via \Ucharcat so
       again I've disabled generally
     - pdfTeX can't make ^^@-catcode 10 so that is disabled
       separately from the bulk of spaces
     - I've not added range checking at the macro level for
       XeTeX/LuaTeX
    
    Also imporant is engine suport here. XeTeX's only had \Ucharcat
    this year, so before that we only get the 8-bit range. LuaTeX's
    had tex.setcatcode since 2011 (v0.70), but again that's later
    than our current 'baseline' requirement (v0.40).
---
 l3kernel/l3candidates.dtx               |  212 +++++++++++++
 l3kernel/testfiles/m3char001.luatex.tlg |  Bin 0 -> 11369 bytes
 l3kernel/testfiles/m3char001.lvt        |  128 ++++++++
 l3kernel/testfiles/m3char001.tlg        |  516 +++++++++++++++++++++++++++++++
 l3kernel/testfiles/m3char001.xetex.tlg  |  447 ++++++++++++++++++++++++++
 5 files changed, 1303 insertions(+)

diff --git a/l3kernel/l3candidates.dtx b/l3kernel/l3candidates.dtx
index 9b3171f..3def846 100644
--- a/l3kernel/l3candidates.dtx
+++ b/l3kernel/l3candidates.dtx
@@ -1059,6 +1059,31 @@
 %   be an active character.
 % \end{function}
 %
+% \begin{function}[EXP, added = 2015-09-09]{\char_generate:nn}
+%   \begin{syntax}
+%      \cs{char_generate:nn} \meta{charcode} \meta{catcode}
+%   \end{syntax}
+%   Generates a character token of the given \meta{charcode} and \meta{catcode}
+%   (both of which may be integer expressions). The \meta{catcode} may be
+%   one of
+%   \begin{itemize}
+%     \item $1$ (begin group)
+%     \item $2$ (end group)
+%     \item $3$ (math toggle)
+%     \item $4$ (alignment)
+%     \item $6$ (parameter)
+%     \item $7$ (math superscript)
+%     \item $8$ (math subscript)
+%     \item $11$ (letter)
+%     \item $12$ (other)
+%   \end{itemize}
+%   and other values will raise an error.
+%
+%   The \meta{catcode} may be any one valid for the engine in use. Note
+%   however that for \XeTeX{} releases prior to 0.99992 only the 8-bit
+%   range ($0$ to $255$) is accepted due to engine limitations.
+% \end{function}
+%
 % \begin{function}[TF, updated = 2012-12-20]{\peek_N_type:}
 %   \begin{syntax}
 %     \cs{peek_N_type:TF} \Arg{true code} \Arg{false code}
@@ -4340,6 +4365,193 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}[EXP]{\char_generate:nn}
+% \begin{macro}[EXP, aux]^^A
+%   {\@@_generate_auxi:nn, \@@_generate_auxii:nn, \@@_generate_auxii:nnn}
+% \begin{variable}{\l_@@_tmp_tl}
+% \begin{macro}[EXP, aux]{\@@_generate_invalid_catcode:}
+%   The aim here is to generate characters of (broadly) arbitrary category
+%   code. Where possible, that is done using engine support (\XeTeX{},
+%   \LuaTeX{}). There are though various issues which are covered below. At
+%   the interface layer, turn the two arguments into integers up-front so
+%   this is only done once.
+%    \begin{macrocode}
+\cs_new:Npn \char_generate:nn #1#2
+  {
+    \exp_args:Nff \@@_generate_auxi:nn
+      { \int_eval:n {#1} } { \int_eval:n {#2} }
+  }
+%    \end{macrocode}
+%   Before doing any actual conversion, first some special case filtering.
+%   The \tn{Ucharcat} primitive cannot make active chars, so that is turned
+%   off here: if the primitive gets altered then the code is already in
+%   place for 8-bit engines and will kick in for \LuaTeX{} too. Spaces
+%   are also banned here as \LuaTeX{} emulation only makes normal (charcode
+%   $32$ spaces. However, |^^@| is filtered out separately as that can't be
+%   done with macro emulation either, so is flagged up separately. That
+%   done, hand off to the engine-dependent part.
+%    \begin{macrocode}
+\cs_new:Npn \@@_generate_auxi:nn #1#2
+  {
+    \if_int_compare:w #2 = \c_thirteen
+      \__msg_kernel_expandable_error:nn { kernel } { char-active }
+    \else:
+      \if_int_compare:w #2 = \c_ten
+        \if_int_compare:w #1 =  \c_zero
+          \__msg_kernel_expandable_error:nn { kernel } { char-null-space }
+        \else:
+          \__msg_kernel_expandable_error:nn { kernel } { char-space }
+        \fi:
+      \else:
+        \@@_generate_auxii:nn {#1} {#2}
+      \fi:
+    \fi: 
+  }
+\tl_new:N \l_@@_tmp_tl
+%    \end{macrocode}
+%   Engine-dependent definitions are now needed for the implementation. For
+%   \LuaTeX{} and recent \XeTeX{} releases there is engine-level support.
+%   They can do cases that macro emulation can't. All of those are filtered
+%   out here using a primitive-based boolean expression for speed.
+%   The final level is the basic definition at the engine level: the arguments
+%   here are integers so there is no need to worry about them too much.
+%    \begin{macrocode}
+\group_begin:
+%<*package>
+  \cs_set_nopar:Npn ^^L { }
+%</package>
+  \char_set_catcode_other:n { 0 }
+  \if_int_compare:w 0
+    \cs_if_exist:NT \luatex_directlua:D { 1 }
+    \cs_if_exist:NT \utex_charcat:D     { 1 }
+    > \c_zero
+    \cs_new:Npn \@@_generate_auxii:nn #1#2
+      {
+        \if_int_compare:w 0
+          \if_int_compare:w #1 < \c_one      1 \fi:
+          \if_int_compare:w #1 = \c_five     1 \fi:
+          \if_int_compare:w #1 = \c_nine     1 \fi:
+          \if_int_compare:w #1 > \c_thirteen 1 \fi:
+          > \c_one
+          \@@_generate_invalid_catcode:
+        \else:
+          \@@_generate_auxiii:nn {#1} {#2}
+        \fi:
+      }
+    \cs_if_exist:NTF \luatex_directlua:D
+      {
+        \cs_new:Npn \@@_generate_auxiii:nn #1#2
+          { \lua_now_x:n { l3kernel.charcat(#1, #2) } }
+      }
+      {
+        \cs_new:Npn \@@_generate_auxiii:nn #1#2
+          { \utex_charcat:D  #1 ~ #2 ~ }
+      }
+  \else:
+%    \end{macrocode}
+%   For engines where \tn{Ucharcat} isn't available (or emulated) then we have
+%   to work in macros, and cover only the $8$-bit range. The first stage is
+%   to build up a |tl| containing |^^@| with each category code that can
+%   be accessed in this way, with an error set up for the other cases. This
+%   is all done such that it can be quickly accessed using a |\if_case:w|
+%   low-level conditional. There are a few things to notice here.
+%   As |^^L| is |\outer| we need to locally set it to avoid a problem.
+%   To get open/close braces into the list, they are set up using |if_false:|
+%   pairing here and will later be |x|-type expanded into the desired form.
+%   For making spaces, there needs to be an |o|-type expansion of a |\use:n|
+%   (or some other tokenization) to avoid dropping the space. We also
+%   set up active tokens although they are (currently) filtered out by the
+%   interface layer (\tn{Ucharcat}| cannot make active tokens).
+%    \begin{macrocode}
+      \tl_set:Nn \l_@@_tmp_tl
+        { \exp_not:n { \@@_generate_invalid_catcode: \or: } }
+      \char_set_catcode_group_begin:n { 0 } % {
+      \tl_put_right:Nn \l_@@_tmp_tl { ^^@ \if_false: } }
+      \char_set_catcode_group_end:n { 0 }
+      \tl_put_right:Nn \l_@@_tmp_tl { { \fi: \exp_not:N \or: ^^@ } % }
+      \tl_set:Nx \l_@@_tmp_tl { \l_@@_tmp_tl }
+      \char_set_catcode_math_toggle:n { 0 }
+      \tl_put_right:Nn \l_@@_tmp_tl { \or: ^^@ }
+      \char_set_catcode_alignment:n { 0 }
+      \tl_put_right:Nn \l_@@_tmp_tl { \or: ^^@ }
+      \tl_put_right:Nn \l_@@_tmp_tl { \or: \@@_generate_invalid_catcode: }
+      \char_set_catcode_parameter:n { 0 }
+      \tl_put_right:Nn \l_@@_tmp_tl { \or: ^^@ }
+      \char_set_catcode_math_superscript:n { 0 }
+      \tl_put_right:Nn \l_@@_tmp_tl { \or: ^^@ }
+      \char_set_catcode_math_subscript:n { 0 }
+      \tl_put_right:Nn \l_@@_tmp_tl { \or: ^^@ }
+      \tl_put_right:Nn \l_@@_tmp_tl { \or: \@@_generate_invalid_catcode: }
+      \char_set_catcode_space:n { 0 }
+      \tl_put_right:No \l_@@_tmp_tl { \use:n { \or: } ^^@ }
+      \char_set_catcode_letter:n { 0 }
+      \tl_put_right:Nn \l_@@_tmp_tl { \or: ^^@ }
+      \char_set_catcode_other:n { 0 }
+      \tl_put_right:Nn \l_@@_tmp_tl { \or: ^^@ }
+      \char_set_catcode_active:n { 0 }
+      \tl_put_right:Nn \l_@@_tmp_tl { \or: ^^@ }
+      \tl_put_right:Nn \l_@@_tmp_tl { \else: \@@_generate_invalid_catcode: }
+%    \end{macrocode}
+%   Convert the above temporary list into a series of constant token
+%   lists, one for each character code, using \tn{tex_lowercase:D} to
+%   convert |^^@| in each case. The \texttt{x}-type expansion deals with
+%   the |\if_false:| stuff introduced earlier. This is done in three parts
+%   as |^^L| is awkward. Notice that at this stage |^^@| is active.
+%    \begin{macrocode}
+      \cs_set_protected:Npn \@@_tmp:n #1
+        {
+          \char_set_lccode:nn { 0 } {#1}
+          \char_set_lccode:nn { 32 } {#1}
+          \exp_args:Nx \tex_lowercase:D
+            {
+              \tl_const:cn { c_@@_ \__int_to_roman:w #1 _tl }
+                { \exp_not:o \l_@@_tmp_tl }
+            }
+        }
+      \int_step_function:nnnN { 0 }  { 1 } { 11 }  \@@_tmp:n
+      \group_begin:
+        \tl_replace_once:Nnn \l_@@_tmp_tl { ^^@ } { \ERROR }
+        \@@_tmp:n { 12 }
+      \group_end:
+      \int_step_function:nnnN { 13 } { 1 } { 255 } \@@_tmp:n
+      \cs_new:Npn \@@_generate_auxii:nn #1#2
+        {
+          \tl_if_exist:cTF { c_@@_ \__int_to_roman:w #1 _tl }
+            {
+              \exp_after:wN \exp_after:wN
+              \if_case:w #2
+                \exp_last_unbraced:Nv \exp_stop_f:
+                  { c_@@_ \__int_to_roman:w #1 _tl }
+              \fi:
+            }
+            {
+              \__msg_kernel_expandable_error:nn { kernel }
+                { char-out-of-range }
+            }
+        }
+  \fi:
+\group_end:
+%    \end{macrocode}
+%   Job done, set up a few messages. 
+%    \begin{macrocode}
+\cs_new:Npn \@@_generate_invalid_catcode:
+  { \__msg_kernel_expandable_error:nn { kernel } { char-invalid-catcode } }
+\__msg_kernel_new:nnn { kernel } { char-active }
+  { Cannot~generate~active~chars. }
+\__msg_kernel_new:nnn { kernel } { char-invalid-catcode }
+  { Invalid~catcode~for~char~generation. }
+\__msg_kernel_new:nnn { kernel } { char-null-space }
+  { Cannot~generate~null~char~as~a~space. }
+\__msg_kernel_new:nnn { kernel } { char-out-of-range }
+  { Charcode~requested~out~of~engine~range. }
+\__msg_kernel_new:nnn { kernel } { char-space }
+  { Cannot~generate~space~chars. }
+%    \end{macrocode}
+% \end{macro}
+% \end{variable}
+% \end{macro}
+% \end{macro}
+%
 %    \begin{macrocode}
 %<@@=peek>
 %    \end{macrocode}
diff --git a/l3kernel/testfiles/m3char001.luatex.tlg b/l3kernel/testfiles/m3char001.luatex.tlg
new file mode 100644
index 0000000..b8b0eb6
Binary files /dev/null and b/l3kernel/testfiles/m3char001.luatex.tlg differ
diff --git a/l3kernel/testfiles/m3char001.lvt b/l3kernel/testfiles/m3char001.lvt
new file mode 100644
index 0000000..3c41126
--- /dev/null
+++ b/l3kernel/testfiles/m3char001.lvt
@@ -0,0 +1,128 @@
+%
+% Copyright (C) 2015 The LaTeX Project
+%
+\documentclass{minimal}
+\input{regression-test}
+\RequirePackage[check-declarations,log-functions]{expl3}
+
+\begin{document}
+\START
+\AUTHOR{Joseph Wright}
+\ExplSyntaxOn
+
+\OMIT
+\cs_set_protected:Npn \test:nn #1#2
+  {
+    \tl_set:Nx \l_tmpa_tl { \char_generate:nn {#1} {#2} }
+    \tl_show:N \l_tmpa_tl
+    \exp_after:wN \tex_show:D \l_tmpa_tl
+  }
+\cs_set_protected:Npn \test_group:n #1
+  {
+    \tl_set:Nx \l_tmpa_tl
+      {
+        \char_generate:nn {#1} { 1 }
+        \char_generate:nn {#1} { 2 }
+      }
+    \tl_show:N \l_tmpa_tl
+  }
+\cs_set_protected:Npn \test_parameter:n #1
+  {
+    \cs_set:Npx \temp { \char_generate:nn {#1} { 6 } }
+    \cs_show:N \temp
+  }
+\TIMO
+
+\TEST { Generate~7-bit~letters~and~other~chars }
+  {
+    \test:nn { 0 }    { 11 }
+    \test:nn { 12 }   { 11 }
+    \test:nn { 32 }   { 11 }
+    \test:nn { 64 }   { 11 }
+    \test:nn { 80 }   { 11 }
+    \test:nn { 127 }  { 11 }
+    \test:nn { 0 }    { 12 }
+    \test:nn { 12 }   { 12 }
+    \test:nn { 32 }   { 12 }
+    \test:nn { 64 }   { 12 }
+    \test:nn { 80 }   { 12 }
+    \test:nn { 127 }  { 12 }
+  }
+
+\TEST { Generate~7-bit~alignment~and~math~tokens }
+  {
+    \test:nn { 0 }    { 3 }
+    \test:nn { 12 }   { 3 }
+    \test:nn { 32 }   { 3 }
+    \test:nn { 64 }   { 3 }
+    \test:nn { 80 }   { 3 }
+    \test:nn { 127 }  { 3 }
+    \test:nn { 0 }    { 4 }
+    \test:nn { 12 }   { 4 }
+    \test:nn { 32 }   { 4 }
+    \test:nn { 64 }   { 4 }
+    \test:nn { 80 }   { 4 }
+    \test:nn { 127 }  { 4 }
+    \test:nn { 0 }    { 7 }
+    \test:nn { 12 }   { 7 }
+    \test:nn { 32 }   { 7 }
+    \test:nn { 64 }   { 7 }
+    \test:nn { 80 }   { 7 }
+    \test:nn { 127 }  { 7 }
+    \test:nn { 0 }    { 8 }
+    \test:nn { 12 }   { 8 }
+    \test:nn { 32 }   { 8 }
+    \test:nn { 64 }   { 8 }
+    \test:nn { 80 }   { 8 }
+    \test:nn { 127 }  { 8 }
+  }
+
+\TEST { Generate~7-bit~awkward }
+  {
+    \test_group:n { 0 }
+    \test_group:n { 12 }
+    \test_group:n { 32 }
+    \test_group:n { 64 }
+    \test_group:n { 80 }
+    \test_group:n { 127 }
+    \test_parameter:n { 0 }
+    \test_parameter:n { 12 }
+    \test_parameter:n { 32 }
+    \test_parameter:n { 64 }
+    \test_parameter:n { 80 }
+    \test_parameter:n { 127 }
+  }
+
+===================
+
+\TEST { Errors }
+  {
+    \char_generate:nn { -1 } { 11 }
+    \char_generate:nn { 64 } { -1 }
+    \char_generate:nn { 64 } { 0 }
+    \char_generate:nn { 64 } { 5 }
+    \char_generate:nn { 64 } { 9 }
+    \char_generate:nn { 64 } { 10 }
+    \char_generate:nn { 64 } { 13 }
+    \char_generate:nn { 64 } { 14 }
+    \char_generate:nn { 64 } { 15 }
+    \char_generate:nn { 64 } { 16 }
+    \char_generate:nn { 64 } { 18 }
+    \char_generate:nn { 0 } { 10 }
+  }
+
+===================
+
+\TEST { Unicode~range }
+  {
+    \test_group:n { 1234 }
+    \test:nn { 1234 } { 3 }
+    \test:nn { 1234 } { 4 }
+    \test_parameter:n { 1234 }
+    \test:nn { 1234 } { 7 }
+    \test:nn { 1234 } { 8 }
+    \test:nn { 1234 } { 11 }
+    \test:nn { 1234 } { 12 }
+  }
+
+\END
\ No newline at end of file
diff --git a/l3kernel/testfiles/m3char001.tlg b/l3kernel/testfiles/m3char001.tlg
new file mode 100644
index 0000000..83ed432
--- /dev/null
+++ b/l3kernel/testfiles/m3char001.tlg
@@ -0,0 +1,516 @@
+This is a generated file for the LaTeX (2e + expl3) validation system.
+Don't change this file in any respect.
+%% \CharacterTable
+%%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+%%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+%%   Digits        \0\1\2\3\4\5\6\7\8\9
+%%   Exclamation   \!     Double quote  \"     Hash (number) \#
+%%   Dollar        \$     Percent       \%     Ampersand     \&
+%%   Acute accent  \'     Left paren    \(     Right paren   \)
+%%   Asterisk      \*     Plus          \+     Comma         \,
+%%   Minus         \-     Point         \.     Solidus       \/
+%%   Colon         \:     Semicolon     \;     Less than     \<
+%%   Equals        \=     Greater than  \>     Question mark \?
+%%   Commercial at \@     Left bracket  \[     Backslash     \\
+%%   Right bracket \]     Circumflex    \^     Underscore    \_
+%%   Grave accent  \`     Left brace    \{     Vertical bar  \|
+%%   Right brace   \}     Tilde         \~}
+%%
+Author: Joseph Wright
+============================================================
+TEST 1: Generate 7-bit letters and other chars
+============================================================
+> \l_tmpa_tl=^^@.
+<recently read> }
+l. ...  }
+> the letter ^^@.
+\l_tmpa_tl ->^^@
+l. ...  }
+> \l_tmpa_tl=^^L.
+<recently read> }
+l. ...  }
+> the letter ^^L.
+\l_tmpa_tl ->^^L
+l. ...  }
+> \l_tmpa_tl= .
+<recently read> }
+l. ...  }
+> the letter  .
+\l_tmpa_tl -> 
+l. ...  }
+> \l_tmpa_tl=@.
+<recently read> }
+l. ...  }
+> the letter @.
+\l_tmpa_tl ->@
+l. ...  }
+> \l_tmpa_tl=P.
+<recently read> }
+l. ...  }
+> the letter P.
+\l_tmpa_tl ->P
+l. ...  }
+> \l_tmpa_tl=^^?.
+<recently read> }
+l. ...  }
+> the letter ^^?.
+\l_tmpa_tl ->^^?
+l. ...  }
+> \l_tmpa_tl=^^@.
+<recently read> }
+l. ...  }
+> the character ^^@.
+\l_tmpa_tl ->^^@
+l. ...  }
+> \l_tmpa_tl=^^L.
+<recently read> }
+l. ...  }
+> the character ^^L.
+\l_tmpa_tl ->^^L
+l. ...  }
+> \l_tmpa_tl= .
+<recently read> }
+l. ...  }
+> the character  .
+\l_tmpa_tl -> 
+l. ...  }
+> \l_tmpa_tl=@.
+<recently read> }
+l. ...  }
+> the character @.
+\l_tmpa_tl ->@
+l. ...  }
+> \l_tmpa_tl=P.
+<recently read> }
+l. ...  }
+> the character P.
+\l_tmpa_tl ->P
+l. ...  }
+> \l_tmpa_tl=^^?.
+<recently read> }
+l. ...  }
+> the character ^^?.
+\l_tmpa_tl ->^^?
+l. ...  }
+============================================================
+============================================================
+TEST 2: Generate 7-bit alignment and math tokens
+============================================================
+> \l_tmpa_tl=^^@.
+<recently read> }
+l. ...  }
+> math shift character ^^@.
+\l_tmpa_tl ->^^@
+l. ...  }
+> \l_tmpa_tl=^^L.
+<recently read> }
+l. ...  }
+> math shift character ^^L.
+\l_tmpa_tl ->^^L
+l. ...  }
+> \l_tmpa_tl= .
+<recently read> }
+l. ...  }
+> math shift character  .
+\l_tmpa_tl -> 
+l. ...  }
+> \l_tmpa_tl=@.
+<recently read> }
+l. ...  }
+> math shift character @.
+\l_tmpa_tl ->@
+l. ...  }
+> \l_tmpa_tl=P.
+<recently read> }
+l. ...  }
+> math shift character P.
+\l_tmpa_tl ->P
+l. ...  }
+> \l_tmpa_tl=^^?.
+<recently read> }
+l. ...  }
+> math shift character ^^?.
+\l_tmpa_tl ->^^?
+l. ...  }
+> \l_tmpa_tl=^^@.
+<recently read> }
+l. ...  }
+> alignment tab character ^^@.
+\l_tmpa_tl ->^^@
+l. ...  }
+> \l_tmpa_tl=^^L.
+<recently read> }
+l. ...  }
+> alignment tab character ^^L.
+\l_tmpa_tl ->^^L
+l. ...  }
+> \l_tmpa_tl= .
+<recently read> }
+l. ...  }
+> alignment tab character  .
+\l_tmpa_tl -> 
+l. ...  }
+> \l_tmpa_tl=@.
+<recently read> }
+l. ...  }
+> alignment tab character @.
+\l_tmpa_tl ->@
+l. ...  }
+> \l_tmpa_tl=P.
+<recently read> }
+l. ...  }
+> alignment tab character P.
+\l_tmpa_tl ->P
+l. ...  }
+> \l_tmpa_tl=^^?.
+<recently read> }
+l. ...  }
+> alignment tab character ^^?.
+\l_tmpa_tl ->^^?
+l. ...  }
+> \l_tmpa_tl=^^@.
+<recently read> }
+l. ...  }
+> superscript character ^^@.
+\l_tmpa_tl ->^^@
+l. ...  }
+> \l_tmpa_tl=^^L.
+<recently read> }
+l. ...  }
+> superscript character ^^L.
+\l_tmpa_tl ->^^L
+l. ...  }
+> \l_tmpa_tl= .
+<recently read> }
+l. ...  }
+> superscript character  .
+\l_tmpa_tl -> 
+l. ...  }
+> \l_tmpa_tl=@.
+<recently read> }
+l. ...  }
+> superscript character @.
+\l_tmpa_tl ->@
+l. ...  }
+> \l_tmpa_tl=P.
+<recently read> }
+l. ...  }
+> superscript character P.
+\l_tmpa_tl ->P
+l. ...  }
+> \l_tmpa_tl=^^?.
+<recently read> }
+l. ...  }
+> superscript character ^^?.
+\l_tmpa_tl ->^^?
+l. ...  }
+> \l_tmpa_tl=^^@.
+<recently read> }
+l. ...  }
+> subscript character ^^@.
+\l_tmpa_tl ->^^@
+l. ...  }
+> \l_tmpa_tl=^^L.
+<recently read> }
+l. ...  }
+> subscript character ^^L.
+\l_tmpa_tl ->^^L
+l. ...  }
+> \l_tmpa_tl= .
+<recently read> }
+l. ...  }
+> subscript character  .
+\l_tmpa_tl -> 
+l. ...  }
+> \l_tmpa_tl=@.
+<recently read> }
+l. ...  }
+> subscript character @.
+\l_tmpa_tl ->@
+l. ...  }
+> \l_tmpa_tl=P.
+<recently read> }
+l. ...  }
+> subscript character P.
+\l_tmpa_tl ->P
+l. ...  }
+> \l_tmpa_tl=^^?.
+<recently read> }
+l. ...  }
+> subscript character ^^?.
+\l_tmpa_tl ->^^?
+l. ...  }
+============================================================
+============================================================
+TEST 3: Generate 7-bit awkward
+============================================================
+> \l_tmpa_tl=^^@^^@.
+<recently read> }
+l. ...  }
+> \l_tmpa_tl=^^L^^L.
+<recently read> }
+l. ...  }
+> \l_tmpa_tl=  .
+<recently read> }
+l. ...  }
+> \l_tmpa_tl=@@.
+<recently read> }
+l. ...  }
+> \l_tmpa_tl=PP.
+<recently read> }
+l. ...  }
+> \l_tmpa_tl=^^?^^?.
+<recently read> }
+l. ...  }
+! Illegal parameter number in definition of \temp.
+<to be read again> 
+}
+l. ...  }
+You meant to type ## instead of #, right?
+Or maybe a } was forgotten somewhere earlier, and things
+are all screwed up? I'm going to assume that you meant ##.
+> \temp=\long macro:->^^@^^@.
+<recently read> }
+l. ...  }
+! Illegal parameter number in definition of \temp.
+<to be read again> 
+}
+l. ...  }
+You meant to type ## instead of #, right?
+Or maybe a } was forgotten somewhere earlier, and things
+are all screwed up? I'm going to assume that you meant ##.
+> \temp=\long macro:->^^L^^L.
+<recently read> }
+l. ...  }
+! Illegal parameter number in definition of \temp.
+<to be read again> 
+}
+l. ...  }
+You meant to type ## instead of #, right?
+Or maybe a } was forgotten somewhere earlier, and things
+are all screwed up? I'm going to assume that you meant ##.
+> \temp=\long macro:->  .
+<recently read> }
+l. ...  }
+! Illegal parameter number in definition of \temp.
+<to be read again> 
+}
+l. ...  }
+You meant to type ## instead of #, right?
+Or maybe a } was forgotten somewhere earlier, and things
+are all screwed up? I'm going to assume that you meant ##.
+> \temp=\long macro:->@@.
+<recently read> }
+l. ...  }
+! Illegal parameter number in definition of \temp.
+<to be read again> 
+}
+l. ...  }
+You meant to type ## instead of #, right?
+Or maybe a } was forgotten somewhere earlier, and things
+are all screwed up? I'm going to assume that you meant ##.
+> \temp=\long macro:->PP.
+<recently read> }
+l. ...  }
+! Illegal parameter number in definition of \temp.
+<to be read again> 
+}
+l. ...  }
+You meant to type ## instead of #, right?
+Or maybe a } was forgotten somewhere earlier, and things
+are all screwed up? I'm going to assume that you meant ##.
+> \temp=\long macro:->^^?^^?.
+<recently read> }
+l. ...  }
+============================================================
+============================================================
+TEST 4: Errors
+============================================================
+! Undefined control sequence.
+<argument> \LaTeX3 error: 
+Invalid catcode for char generation.
+l. ...  }
+The control sequence at the end of the top line
+of your error message was never \def'ed. If you have
+misspelled it (e.g., `\hobx'), type `I' and the correct
+spelling (e.g., `I\hbox'). Otherwise just continue,
+and I'll forget about whatever was undefined.
+! Undefined control sequence.
+<argument> \LaTeX3 error: 
+Invalid catcode for char generation.
+l. ...  }
+The control sequence at the end of the top line
+of your error message was never \def'ed. If you have
+misspelled it (e.g., `\hobx'), type `I' and the correct
+spelling (e.g., `I\hbox'). Otherwise just continue,
+and I'll forget about whatever was undefined.
+! Undefined control sequence.
+<argument> \LaTeX3 error: 
+Invalid catcode for char generation.
+l. ...  }
+The control sequence at the end of the top line
+of your error message was never \def'ed. If you have
+misspelled it (e.g., `\hobx'), type `I' and the correct
+spelling (e.g., `I\hbox'). Otherwise just continue,
+and I'll forget about whatever was undefined.
+! Undefined control sequence.
+<argument> \LaTeX3 error: 
+Invalid catcode for char generation.
+l. ...  }
+The control sequence at the end of the top line
+of your error message was never \def'ed. If you have
+misspelled it (e.g., `\hobx'), type `I' and the correct
+spelling (e.g., `I\hbox'). Otherwise just continue,
+and I'll forget about whatever was undefined.
+! Undefined control sequence.
+<argument> \LaTeX3 error: 
+Cannot generate space chars.
+l. ...  }
+The control sequence at the end of the top line
+of your error message was never \def'ed. If you have
+misspelled it (e.g., `\hobx'), type `I' and the correct
+spelling (e.g., `I\hbox'). Otherwise just continue,
+and I'll forget about whatever was undefined.
+! Undefined control sequence.
+<argument> \LaTeX3 error: 
+Cannot generate active chars.
+l. ...  }
+The control sequence at the end of the top line
+of your error message was never \def'ed. If you have
+misspelled it (e.g., `\hobx'), type `I' and the correct
+spelling (e.g., `I\hbox'). Otherwise just continue,
+and I'll forget about whatever was undefined.
+! Undefined control sequence.
+<argument> \LaTeX3 error: 
+Invalid catcode for char generation.
+l. ...  }
+The control sequence at the end of the top line
+of your error message was never \def'ed. If you have
+misspelled it (e.g., `\hobx'), type `I' and the correct
+spelling (e.g., `I\hbox'). Otherwise just continue,
+and I'll forget about whatever was undefined.
+! Undefined control sequence.
+<argument> \LaTeX3 error: 
+Invalid catcode for char generation.
+l. ...  }
+The control sequence at the end of the top line
+of your error message was never \def'ed. If you have
+misspelled it (e.g., `\hobx'), type `I' and the correct
+spelling (e.g., `I\hbox'). Otherwise just continue,
+and I'll forget about whatever was undefined.
+! Undefined control sequence.
+<argument> \LaTeX3 error: 
+Invalid catcode for char generation.
+l. ...  }
+The control sequence at the end of the top line
+of your error message was never \def'ed. If you have
+misspelled it (e.g., `\hobx'), type `I' and the correct
+spelling (e.g., `I\hbox'). Otherwise just continue,
+and I'll forget about whatever was undefined.
+! Undefined control sequence.
+<argument> \LaTeX3 error: 
+Invalid catcode for char generation.
+l. ...  }
+The control sequence at the end of the top line
+of your error message was never \def'ed. If you have
+misspelled it (e.g., `\hobx'), type `I' and the correct
+spelling (e.g., `I\hbox'). Otherwise just continue,
+and I'll forget about whatever was undefined.
+! Undefined control sequence.
+<argument> \LaTeX3 error: 
+Cannot generate null char as a space.
+l. ...  }
+The control sequence at the end of the top line
+of your error message was never \def'ed. If you have
+misspelled it (e.g., `\hobx'), type `I' and the correct
+spelling (e.g., `I\hbox'). Otherwise just continue,
+and I'll forget about whatever was undefined.
+============================================================
+============================================================
+TEST 5: Unicode range
+============================================================
+! Undefined control sequence.
+<argument> \LaTeX3 error: 
+Charcode requested out of engine range.
+l. ...  }
+The control sequence at the end of the top line
+of your error message was never \def'ed. If you have
+misspelled it (e.g., `\hobx'), type `I' and the correct
+spelling (e.g., `I\hbox'). Otherwise just continue,
+and I'll forget about whatever was undefined.
+! Undefined control sequence.
+<argument> \LaTeX3 error: 
+Charcode requested out of engine range.
+l. ...  }
+The control sequence at the end of the top line
+of your error message was never \def'ed. If you have
+misspelled it (e.g., `\hobx'), type `I' and the correct
+spelling (e.g., `I\hbox'). Otherwise just continue,
+and I'll forget about whatever was undefined.
+> \l_tmpa_tl=.
+<recently read> }
+l. ...  }
+! Undefined control sequence.
+<argument> \LaTeX3 error: 
+Charcode requested out of engine range.
+l. ...  }
+The control sequence at the end of the top line
+of your error message was never \def'ed. If you have
+misspelled it (e.g., `\hobx'), type `I' and the correct
+spelling (e.g., `I\hbox'). Otherwise just continue,
+and I'll forget about whatever was undefined.
+> \l_tmpa_tl=.
+<recently read> }
+l. ...  }
+> \test:nn=\protected\long macro:
+#1#2->\tl_set:Nx \l_tmpa_tl {\char_generate:nn {#1}{#2}}\tl_show:N \l_tmpa_tl \exp_after:wN \tex_show:D \l_tmpa_tl .
+<argument> ...:n {1234}\test:nn {1234}{3}\test:nn 
+{1234}{4}\test_parameter:n...
+l. ...  }
+! Undefined control sequence.
+<argument> \LaTeX3 error: 
+Charcode requested out of engine range.
+l. ...  }
+The control sequence at the end of the top line
+of your error message was never \def'ed. If you have
+misspelled it (e.g., `\hobx'), type `I' and the correct
+spelling (e.g., `I\hbox'). Otherwise just continue,
+and I'll forget about whatever was undefined.
+> \temp=\long macro:->.
+<recently read> }
+l. ...  }
+! Undefined control sequence.
+<argument> \LaTeX3 error: 
+Charcode requested out of engine range.
+l. ...  }
+The control sequence at the end of the top line
+of your error message was never \def'ed. If you have
+misspelled it (e.g., `\hobx'), type `I' and the correct
+spelling (e.g., `I\hbox'). Otherwise just continue,
+and I'll forget about whatever was undefined.
+> \l_tmpa_tl=.
+<recently read> }
+l. ...  }
+> \test:nn=\protected\long macro:
+#1#2->\tl_set:Nx \l_tmpa_tl {\char_generate:nn {#1}{#2}}\tl_show:N \l_tmpa_tl \exp_after:wN \tex_show:D \l_tmpa_tl .
+<argument> ...:n {1234}\test:nn {1234}{7}\test:nn 
+{1234}{8}\test:nn {1234}{1...
+l. ...  }
+! Undefined control sequence.
+<argument> \LaTeX3 error: 
+Charcode requested out of engine range.
+l. ...  }
+The control sequence at the end of the top line
+of your error message was never \def'ed. If you have
+misspelled it (e.g., `\hobx'), type `I' and the correct
+spelling (e.g., `I\hbox'). Otherwise just continue,
+and I'll forget about whatever was undefined.
+> \l_tmpa_tl=.
+<recently read> }
+l. ...  }
+> \test:nn=\protected\long macro:
+#1#2->\tl_set:Nx \l_tmpa_tl {\char_generate:nn {#1}{#2}}\tl_show:N \l_tmpa_tl \exp_after:wN \tex_show:D \l_tmpa_tl .
+<argument> ...1234}{8}\test:nn {1234}{11}\test:nn 
+{1234}{12}
+l. ...  }
+============================================================
diff --git a/l3kernel/testfiles/m3char001.xetex.tlg b/l3kernel/testfiles/m3char001.xetex.tlg
new file mode 100644
index 0000000..e13ea27
--- /dev/null
+++ b/l3kernel/testfiles/m3char001.xetex.tlg
@@ -0,0 +1,447 @@
+This is a generated file for the LaTeX (2e + expl3) validation system.
+Don't change this file in any respect.
+%% \CharacterTable
+%%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+%%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+%%   Digits        \0\1\2\3\4\5\6\7\8\9
+%%   Exclamation   \!     Double quote  \"     Hash (number) \#
+%%   Dollar        \$     Percent       \%     Ampersand     \&
+%%   Acute accent  \'     Left paren    \(     Right paren   \)
+%%   Asterisk      \*     Plus          \+     Comma         \,
+%%   Minus         \-     Point         \.     Solidus       \/
+%%   Colon         \:     Semicolon     \;     Less than     \<
+%%   Equals        \=     Greater than  \>     Question mark \?
+%%   Commercial at \@     Left bracket  \[     Backslash     \\
+%%   Right bracket \]     Circumflex    \^     Underscore    \_
+%%   Grave accent  \`     Left brace    \{     Vertical bar  \|
+%%   Right brace   \}     Tilde         \~}
+%%
+Author: Joseph Wright
+============================================================
+TEST 1: Generate 7-bit letters and other chars
+============================================================
+> \l_tmpa_tl=^^@.
+<recently read> }
+l. ...  }
+> the letter ^^@.
+\l_tmpa_tl ->^^@
+l. ...  }
+> \l_tmpa_tl=^^L.
+<recently read> }
+l. ...  }
+> the letter ^^L.
+\l_tmpa_tl ->^^L
+l. ...  }
+> \l_tmpa_tl= .
+<recently read> }
+l. ...  }
+> the letter  .
+\l_tmpa_tl -> 
+l. ...  }
+> \l_tmpa_tl=@.
+<recently read> }
+l. ...  }
+> the letter @.
+\l_tmpa_tl ->@
+l. ...  }
+> \l_tmpa_tl=P.
+<recently read> }
+l. ...  }
+> the letter P.
+\l_tmpa_tl ->P
+l. ...  }
+> \l_tmpa_tl=^^?.
+<recently read> }
+l. ...  }
+> the letter ^^?.
+\l_tmpa_tl ->^^?
+l. ...  }
+> \l_tmpa_tl=^^@.
+<recently read> }
+l. ...  }
+> the character ^^@.
+\l_tmpa_tl ->^^@
+l. ...  }
+> \l_tmpa_tl=^^L.
+<recently read> }
+l. ...  }
+> the character ^^L.
+\l_tmpa_tl ->^^L
+l. ...  }
+> \l_tmpa_tl= .
+<recently read> }
+l. ...  }
+> the character  .
+\l_tmpa_tl -> 
+l. ...  }
+> \l_tmpa_tl=@.
+<recently read> }
+l. ...  }
+> the character @.
+\l_tmpa_tl ->@
+l. ...  }
+> \l_tmpa_tl=P.
+<recently read> }
+l. ...  }
+> the character P.
+\l_tmpa_tl ->P
+l. ...  }
+> \l_tmpa_tl=^^?.
+<recently read> }
+l. ...  }
+> the character ^^?.
+\l_tmpa_tl ->^^?
+l. ...  }
+============================================================
+============================================================
+TEST 2: Generate 7-bit alignment and math tokens
+============================================================
+> \l_tmpa_tl=^^@.
+<recently read> }
+l. ...  }
+> math shift character ^^@.
+\l_tmpa_tl ->^^@
+l. ...  }
+> \l_tmpa_tl=^^L.
+<recently read> }
+l. ...  }
+> math shift character ^^L.
+\l_tmpa_tl ->^^L
+l. ...  }
+> \l_tmpa_tl= .
+<recently read> }
+l. ...  }
+> math shift character  .
+\l_tmpa_tl -> 
+l. ...  }
+> \l_tmpa_tl=@.
+<recently read> }
+l. ...  }
+> math shift character @.
+\l_tmpa_tl ->@
+l. ...  }
+> \l_tmpa_tl=P.
+<recently read> }
+l. ...  }
+> math shift character P.
+\l_tmpa_tl ->P
+l. ...  }
+> \l_tmpa_tl=^^?.
+<recently read> }
+l. ...  }
+> math shift character ^^?.
+\l_tmpa_tl ->^^?
+l. ...  }
+> \l_tmpa_tl=^^@.
+<recently read> }
+l. ...  }
+> alignment tab character ^^@.
+\l_tmpa_tl ->^^@
+l. ...  }
+> \l_tmpa_tl=^^L.
+<recently read> }
+l. ...  }
+> alignment tab character ^^L.
+\l_tmpa_tl ->^^L
+l. ...  }
+> \l_tmpa_tl= .
+<recently read> }
+l. ...  }
+> alignment tab character  .
+\l_tmpa_tl -> 
+l. ...  }
+> \l_tmpa_tl=@.
+<recently read> }
+l. ...  }
+> alignment tab character @.
+\l_tmpa_tl ->@
+l. ...  }
+> \l_tmpa_tl=P.
+<recently read> }
+l. ...  }
+> alignment tab character P.
+\l_tmpa_tl ->P
+l. ...  }
+> \l_tmpa_tl=^^?.
+<recently read> }
+l. ...  }
+> alignment tab character ^^?.
+\l_tmpa_tl ->^^?
+l. ...  }
+> \l_tmpa_tl=^^@.
+<recently read> }
+l. ...  }
+> superscript character ^^@.
+\l_tmpa_tl ->^^@
+l. ...  }
+> \l_tmpa_tl=^^L.
+<recently read> }
+l. ...  }
+> superscript character ^^L.
+\l_tmpa_tl ->^^L
+l. ...  }
+> \l_tmpa_tl= .
+<recently read> }
+l. ...  }
+> superscript character  .
+\l_tmpa_tl -> 
+l. ...  }
+> \l_tmpa_tl=@.
+<recently read> }
+l. ...  }
+> superscript character @.
+\l_tmpa_tl ->@
+l. ...  }
+> \l_tmpa_tl=P.
+<recently read> }
+l. ...  }
+> superscript character P.
+\l_tmpa_tl ->P
+l. ...  }
+> \l_tmpa_tl=^^?.
+<recently read> }
+l. ...  }
+> superscript character ^^?.
+\l_tmpa_tl ->^^?
+l. ...  }
+> \l_tmpa_tl=^^@.
+<recently read> }
+l. ...  }
+> subscript character ^^@.
+\l_tmpa_tl ->^^@
+l. ...  }
+> \l_tmpa_tl=^^L.
+<recently read> }
+l. ...  }
+> subscript character ^^L.
+\l_tmpa_tl ->^^L
+l. ...  }
+> \l_tmpa_tl= .
+<recently read> }
+l. ...  }
+> subscript character  .
+\l_tmpa_tl -> 
+l. ...  }
+> \l_tmpa_tl=@.
+<recently read> }
+l. ...  }
+> subscript character @.
+\l_tmpa_tl ->@
+l. ...  }
+> \l_tmpa_tl=P.
+<recently read> }
+l. ...  }
+> subscript character P.
+\l_tmpa_tl ->P
+l. ...  }
+> \l_tmpa_tl=^^?.
+<recently read> }
+l. ...  }
+> subscript character ^^?.
+\l_tmpa_tl ->^^?
+l. ...  }
+============================================================
+============================================================
+TEST 3: Generate 7-bit awkward
+============================================================
+> \l_tmpa_tl=^^@^^@.
+<recently read> }
+l. ...  }
+> \l_tmpa_tl=^^L^^L.
+<recently read> }
+l. ...  }
+> \l_tmpa_tl=  .
+<recently read> }
+l. ...  }
+> \l_tmpa_tl=@@.
+<recently read> }
+l. ...  }
+> \l_tmpa_tl=PP.
+<recently read> }
+l. ...  }
+> \l_tmpa_tl=^^?^^?.
+<recently read> }
+l. ...  }
+! Illegal parameter number in definition of \temp.
+<to be read again> 
+}
+l. ...  }
+You meant to type ## instead of #, right?
+Or maybe a } was forgotten somewhere earlier, and things
+are all screwed up? I'm going to assume that you meant ##.
+> \temp=\long macro:->^^@^^@.
+<recently read> }
+l. ...  }
+! Illegal parameter number in definition of \temp.
+<to be read again> 
+}
+l. ...  }
+You meant to type ## instead of #, right?
+Or maybe a } was forgotten somewhere earlier, and things
+are all screwed up? I'm going to assume that you meant ##.
+> \temp=\long macro:->^^L^^L.
+<recently read> }
+l. ...  }
+! Illegal parameter number in definition of \temp.
+<to be read again> 
+}
+l. ...  }
+You meant to type ## instead of #, right?
+Or maybe a } was forgotten somewhere earlier, and things
+are all screwed up? I'm going to assume that you meant ##.
+> \temp=\long macro:->  .
+<recently read> }
+l. ...  }
+! Illegal parameter number in definition of \temp.
+<to be read again> 
+}
+l. ...  }
+You meant to type ## instead of #, right?
+Or maybe a } was forgotten somewhere earlier, and things
+are all screwed up? I'm going to assume that you meant ##.
+> \temp=\long macro:->@@.
+<recently read> }
+l. ...  }
+! Illegal parameter number in definition of \temp.
+<to be read again> 
+}
+l. ...  }
+You meant to type ## instead of #, right?
+Or maybe a } was forgotten somewhere earlier, and things
+are all screwed up? I'm going to assume that you meant ##.
+> \temp=\long macro:->PP.
+<recently read> }
+l. ...  }
+! Illegal parameter number in definition of \temp.
+<to be read again> 
+}
+l. ...  }
+You meant to type ## instead of #, right?
+Or maybe a } was forgotten somewhere earlier, and things
+are all screwed up? I'm going to assume that you meant ##.
+> \temp=\long macro:->^^?^^?.
+<recently read> }
+l. ...  }
+============================================================
+============================================================
+TEST 4: Errors
+============================================================
+! Bad character code (-1).
+\__char_generate_auxiii:nn ...>\utex_charcat:D #1 
+#2 
+l. ...  }
+A Unicode scalar value must be between 0 and "10FFFF.
+I changed this one to zero.
+! Invalid code (-1), should be in the ranges 1..4, 6..8, 10..12.
+\__char_generate_auxiii:nn ...tex_charcat:D #1 #2 
+l. ...  }
+I'm going to use 12 instead of that illegal code value.
+! Invalid code (0), should be in the ranges 1..4, 6..8, 10..12.
+\__char_generate_auxiii:nn ...tex_charcat:D #1 #2 
+l. ...  }
+I'm going to use 12 instead of that illegal code value.
+! Invalid code (5), should be in the ranges 1..4, 6..8, 10..12.
+\__char_generate_auxiii:nn ...tex_charcat:D #1 #2 
+l. ...  }
+I'm going to use 12 instead of that illegal code value.
+! Invalid code (9), should be in the ranges 1..4, 6..8, 10..12.
+\__char_generate_auxiii:nn ...tex_charcat:D #1 #2 
+l. ...  }
+I'm going to use 12 instead of that illegal code value.
+! Undefined control sequence.
+<argument> \LaTeX3 error: 
+Cannot generate space chars.
+l. ...  }
+The control sequence at the end of the top line
+of your error message was never \def'ed. If you have
+misspelled it (e.g., `\hobx'), type `I' and the correct
+spelling (e.g., `I\hbox'). Otherwise just continue,
+and I'll forget about whatever was undefined.
+! Undefined control sequence.
+<argument> \LaTeX3 error: 
+Cannot generate active chars.
+l. ...  }
+The control sequence at the end of the top line
+of your error message was never \def'ed. If you have
+misspelled it (e.g., `\hobx'), type `I' and the correct
+spelling (e.g., `I\hbox'). Otherwise just continue,
+and I'll forget about whatever was undefined.
+! Invalid code (14), should be in the ranges 1..4, 6..8, 10..12.
+\__char_generate_auxiii:nn ...tex_charcat:D #1 #2 
+l. ...  }
+I'm going to use 12 instead of that illegal code value.
+! Invalid code (15), should be in the ranges 1..4, 6..8, 10..12.
+\__char_generate_auxiii:nn ...tex_charcat:D #1 #2 
+l. ...  }
+I'm going to use 12 instead of that illegal code value.
+! Invalid code (16), should be in the ranges 1..4, 6..8, 10..12.
+\__char_generate_auxiii:nn ...tex_charcat:D #1 #2 
+l. ...  }
+I'm going to use 12 instead of that illegal code value.
+! Invalid code (18), should be in the ranges 1..4, 6..8, 10..12.
+\__char_generate_auxiii:nn ...tex_charcat:D #1 #2 
+l. ...  }
+I'm going to use 12 instead of that illegal code value.
+! Undefined control sequence.
+<argument> \LaTeX3 error: 
+Cannot generate null char as a space.
+l. ...  }
+The control sequence at the end of the top line
+of your error message was never \def'ed. If you have
+misspelled it (e.g., `\hobx'), type `I' and the correct
+spelling (e.g., `I\hbox'). Otherwise just continue,
+and I'll forget about whatever was undefined.
+============================================================
+============================================================
+TEST 5: Unicode range
+============================================================
+> \l_tmpa_tl=ӒӒ.
+<recently read> }
+l. ...  }
+> \l_tmpa_tl=Ӓ.
+<recently read> }
+l. ...  }
+> math shift character Ӓ.
+\l_tmpa_tl ->Ӓ
+l. ...  }
+> \l_tmpa_tl=Ӓ.
+<recently read> }
+l. ...  }
+> alignment tab character Ӓ.
+\l_tmpa_tl ->Ӓ
+l. ...  }
+! Illegal parameter number in definition of \temp.
+<to be read again> 
+}
+l. ...  }
+You meant to type ## instead of #, right?
+Or maybe a } was forgotten somewhere earlier, and things
+are all screwed up? I'm going to assume that you meant ##.
+> \temp=\long macro:->ӒӒ.
+<recently read> }
+l. ...  }
+> \l_tmpa_tl=Ӓ.
+<recently read> }
+l. ...  }
+> superscript character Ӓ.
+\l_tmpa_tl ->Ӓ
+l. ...  }
+> \l_tmpa_tl=Ӓ.
+<recently read> }
+l. ...  }
+> subscript character Ӓ.
+\l_tmpa_tl ->Ӓ
+l. ...  }
+> \l_tmpa_tl=Ӓ.
+<recently read> }
+l. ...  }
+> the letter Ӓ.
+\l_tmpa_tl ->Ӓ
+l. ...  }
+> \l_tmpa_tl=Ӓ.
+<recently read> }
+l. ...  }
+> the character Ӓ.
+\l_tmpa_tl ->Ӓ
+l. ...  }
+============================================================

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the latex3-commits mailing list