我有以下 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 中,0x110000
XeTeX 和 LuaTeX 的整个 Unicode,从0x0000
到0x10FFFF
)维护: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 { ! } }
}