如何获取作为宏参数接收的字符的字符代码?
举个例子:在下面的 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}