[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