我有以下代码来将 catcode 打印为下标。能否改进它以使其也适用于反斜杠和括号?那么空格呢?(我不是在问注释字符和忽略字符,但这也很有趣)。
\documentclass{article}
\usepackage{expl3,xparse}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\ExplSyntaxOn
\NewDocumentCommand\showcatcodes { m }
{
\tl_map_inline:nn { #1 }
{
\tl_to_str:n {##1} \textsubscript{\char_value_catcode:n{`##1}}
}
}
\ExplSyntaxOff
\begin{document}
\showcatcodes{abcde123!$_ ^€\{\}}
\end{document}
答案1
您可以使用l3regex
:
\documentclass{article}
\usepackage{expl3,xparse,l3regex}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\ExplSyntaxOn
\NewDocumentCommand\showcatcodes { v }
{
\regex_extract_all:nnN { . } { #1 } \l_tmpa_seq
\seq_map_inline:Nn \l_tmpa_seq
{ \ulrike_value_catcode:x { \tl_to_str:n {##1} } }
}
\cs_new_protected:Nn \ulrike_value_catcode:n
{
#1\textsubscript{\char_value_catcode:n { `#1 }}
}
\cs_generate_variant:Nn \ulrike_value_catcode:n { x }
\ExplSyntaxOff
\begin{document}
\showcatcodes{abcde123!$_ ^€\{\}}
\end{document}
这是使用 XeLaTeX 的输出(删除inputenc
和之后fontenc
):
最终版本采用\textvisiblespace
等宽字体作为字符:
\documentclass{article}
\usepackage{expl3,xparse,l3regex}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\ExplSyntaxOn
\NewDocumentCommand\showcatcodes { v }
{
\group_begin:
\ttfamily
\regex_extract_all:nnN { . } { #1 } \l_tmpa_seq
\seq_map_inline:Nn \l_tmpa_seq
{ \ulrike_value_catcode:x { \tl_to_str:n {##1} } }
\group_end:
}
\cs_new_protected:Nn \ulrike_value_catcode:n
{
\tl_if_blank:nTF { #1 } { \textvisiblespace } { #1 }
\textsubscript{\normalfont\char_value_catcode:n { `#1 }}
}
\cs_generate_variant:Nn \ulrike_value_catcode:n { x }
\ExplSyntaxOff
\begin{document}
\showcatcodes{abcde123!$_ ^€\{\}}
\end{document}
答案2
除了空间之外你还可以做
\documentclass{article}
\usepackage{expl3,xparse}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\ExplSyntaxOn
\NewDocumentCommand\showcatcodes { m }
{
\expandafter\tl_map_inline:nn\expandafter{ \detokenize{#1} }
{
\tl_to_str:n {##1} \textsubscript{\char_value_catcode:n{`##1}}
}
}
\ExplSyntaxOff
\begin{document}
\showcatcodes{a bcde123!$_ ^€\{\} {} }
\end{document}
在使用 `\detokenize 确保其他所有内容安全之后,您应该能够通过使用\scantokens
更改空间的 catcode 来执行此操作,但 scantokens 是一种危险的野兽,它目前正在反咬一口。