是否有一个命令可以执行相反的操作\alph
,即获取一个字母并给出该字母在字母表中对应的数字?
如果有,那么\Alph
,\roman
或怎么样\Roman
?
语境:
我有一个分段命令\subtask
,用于排版练习表的解决方案,有时我不会按照“正确”的顺序回答子任务。子任务使用小写拉丁字母进行编号\alph
。
我调整了命令,这样\subtask[4]
当我想跳转到子任务“d”时就可以写入。这很好,但\subtask[d]
会更加方便用户使用。因此,问题来了。
答案1
数字上下文中的反引号可用于获取字母的字符代码。这可用于计算字母在字母表中的位置。
的参数的定义范围为到
\inversalph
,并且对于到。a
z
A
Z
\inverseAlph
该字母可以隐藏在宏(甚至是嵌套的宏)中。
\documentclass{article}
\newcommand*{\inversalph}[1]{%
\the\numexpr(\expandafter`\romannumeral-`\x#1-`a+1)\relax
}
\newcommand*{\inversAlph}[1]{%
\the\numexpr(\expandafter`\romannumeral-`\x#1-`A+1)\relax
}
\begin{document}
a: \inversalph{a},
b: \inversalph{b},
k: \inversalph{k},
z: \inversalph{z}
A: \inversAlph{A},
B: \inversAlph{B},
K: \inversAlph{K},
Z: \inversAlph{Z}
\def\lettera{a}
\def\letterz{z}
\def\letteraa{\lettera}
\def\letterzz{\letterz}
\lettera: \inversalph{\lettera} = \inversalph{\letteraa},
\letterz: \inversalph{\letterz} = \inversalph{\letterzz}
Page: \inversalph{\alph{page}}
\end{document}
评论:
\numexpr
用于计算。\romannumeral-`\x
是一个将以下标记扩展多次的技巧。
答案2
\int_from_alph:n
使用或\int_from_roman:n
的快速解决方案expl3
。请注意,a
和A
在这里并不重要,并且这里的大写和小写罗马数字也是相同的。
该\setcounter{section}{\alphtonumber{w}}
示例用于表明宏是可扩展的。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\newcommand{\alphtonumber}[1]{%
\int_from_alph:n{#1}
}
\newcommand{\romantonumber}[1]{%
\int_from_roman:n{#1}
}
\ExplSyntaxOff
\usepackage{pgffor}
\begin{document}
\alphtonumber{a} -- \alphtonumber{z}
And \alphtonumber{M}\ is a pretty number and \romantonumber{MMXVI} is a good year (more or less), as well as \romantonumber{mdcccclxxiv} was a good year.
\setcounter{section}{\alphtonumber{w}}
\section{Foo}
\end{document}
答案3
数字始终存储在计数器中,\alph
而 等仅用于显示值。
例如如果你定义
\newcounter{foo}
\renewcommand{\thefoo}{\alph{foo}}
和
\thefoo
你得到 a,b,c,…
但
\value{foo}
您始终可以访问计数器的整数值。