使用宏参数的字符代码

使用宏参数的字符代码

如何获取作为宏参数接收的字符的字符代码?

举个例子:在下面的 MWE 中,\letterwithnum{<n>}生成字母表中的第 n 个字母。\getletternum{<letter>}应该执行相反的操作,但`\#转换为 35,并且参数替换不会发生。我该如何解决这个问题?

\documentclass{article}

\def\letterwithnum#1{%
    \char\numexpr`\a-1+#1\relax%
}

\def\getletternum#1{%
    \the\numexpr`\#1-`\a+1\relax%
}

\begin{document}

\letterwithnum{11} % -> k

\getletternum{k} % -> 351-`1 with error

\end{document}

答案1

只需使用`#1即可。也可以省略反斜杠\a。有两种表示字母常量的方法:

`<char>
`\<char>

也就是反引号后面跟着一个只有一个字符的宏;在这种情况下,这样的宏不会被解释,而只是一种转义字符的方式。只有对某些特殊字符才有必要

\ # %

还有一些需要符号^^的,例如

^^M ^^?

因此,如果你想获取的字符代码^^M,你需要

`\^^M

(顺便说一下,它是 13)。您无法输入`%,因此`\%是必需的,反斜杠也是一样。

对于字母来说,反斜杠是不需要的,所以你的代码也可以

\def\letterwithnum#1{%
    \char\numexpr`a-1+#1\relax
}

\def\getletternum#1{%
    \the\numexpr`#1-`a+1\relax
}

并且\newcommand应该与 LaTeX 一起使用。

我还可以建议使用预定义函数:

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn

\NewExpandableDocumentCommand{\letterfromnum}{m}
 {
  \int_to_alph:n { #1 }
 }

\NewExpandableDocumentCommand{\getletternum}{m}
 {
  \int_from_alph:n { #1 }
 }

\ExplSyntaxOff

\begin{document}

\letterfromnum{11} should print k

\getletternum{k} should print 11

\end{document}

在此处输入图片描述

答案2

只需使用#1, 代替\#1

\documentclass{article}

\def\letterwithnum#1{%
    \char\numexpr`\a-1+#1\relax%
}

\def\getletternum#1{%
    \the\numexpr`#1-`\a+1\relax%
}

\begin{document}

\letterwithnum{11} % -> k

\getletternum{k} % -> 351-`1 with error

\end{document}

在此处输入图片描述

相关内容