使用 LaTeX3 在 LaTeX 中打印 catcodes

使用 LaTeX3 在 LaTeX 中打印 catcodes

我有以下 MWE,它打印列表中每个字符的 catcode。

输入方法是:

\MyList{`+,{`,},`\%,`a}

但我想简化如下:

\MyList{+,{,},\%,a}

这里是 MWE:

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{xparse,expl3}
\ExplSyntaxOn

\cs_new:Npn \catcode_print:n #1 
 {
  The~catcode~of~\tl_to_str:n {#1}~is~\char_value_catcode:n {#1} \par
 }
\NewDocumentCommand { \MyList }
 { > { \SplitList { , } } m }
 { \ProcessList {#1} { \catcode_print:n } }
\ExplSyntaxOff
\begin{document}
 \MyList{`+,{`,},`\%,`a}
% \MyList{+,{,},\%,a}
\end{document}

编辑和 PS:我想反转数字以获取相应的字符:例如: \tex_number:D A打印 65。但我想插入65并得到结果A

答案1

当然,不可扩展:

\def\achar#1{\begingroup\lccode`!=#1\lowercase{\endgroup!}}

\achar{65}
\achar{`A}
\achar{"41}

会给

AAA

但是当然

\char<number>

效果相同。\achar如果您想要定义一个宏来扩展为数字给出的字符(类别代码为 12),此技巧会很有用:

\def\achar#1#2{\begingroup\lccode`!=#2\lowercase{\endgroup\def#1{!}}}

\achar\firstA{65}
\achar\secondA{`A}
\achar\thirdA{"41}
\show\firstA \show\secondA \show\thirdA

做什么\achar?它启动一个组,其中感叹号的小写对应项设置为字符#2(应该是数字,以 TeX 允许指定整数常量的任何格式)。此对应关系由一个数组(256 个分量向量,在 8 位 TeX 中,0x110000XeTeX 和 LuaTeX 的整个 Unicode,从0x00000x10FFFF)维护:n-th 条目指定字符数的小写对应项n

当我们说时\lowercase{<tokens>},TeX 会执行每个的替换特点用小写字母对应标记替换标记,然后将这样获得的标记列表插回到输入流中,以便再次读取。在我们的例子中\endgroup\def和的第一个参数\achar不会被触及,因为它们不是字符标记,因此只会!被转换为具有我们在第二个参数中指定的数字的字符。请注意,TeX 仍然没有执行\endgroup:它只在标记列表放回时才执行。因此,组被关闭,分配\lccode被遗忘,并且\def执行了。

例如\achar\firstA{65},的替换文本\firstA具有A类别代码 12,因为!具有类别代码 12 并且\lowercase不会更改此属性。

LaTeX3 代码也是一样的:

\NewDocumentCommand { \achar } { m m }
  {
    \group_begin:
    \char_set_lccode:nn { `! } { #2 }
    \tl_to_lowercase:n { \group_end: \cs_new:Npn #1 { ! } }
  }

相关内容