将 catcode 打印为下标

将 catcode 打印为下标

我有以下代码来将 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 是一种危险的野兽,它目前正在反咬一口。

相关内容