我想要一个不寻常的编号,aAa
如下所示:
0 -> *
-------------------------
1 -> a
2 -> b
...
25 -> y
26 -> z
-------------------------
27 -> A
28 -> B
...
51 -> Y
52 -> Z
-------------------------
53 -> 1
54 -> 2
55 -> 3
...
由于它可能用于页码编号或类似的敏感上下文,因此\@aAa
应该引入该命令以便\pagenumbering{aAa}
工作(我不会以这种方式使用它,但我仍然需要它)。同样,欢迎完全可扩展的解决方案。
答案1
通过使用已定义的宏来返回计数器的字母表达式,这看起来非常简单。
为什么\aAa
和\@aAa
?
\<number style>
首先,和有什么区别\@<number style>
?
而 的参数\@<number style>
是一个“数字”,它可以是一个计数器、一个\numexpr
或者仅仅是42
, 的参数\<number style>
必须是一个 LaTeX 计数器的名称,更准确地说,是一个由 定义的计数器的名称\newcounter{<name>}
(它定义了一个名为 的 TeX 计数器\c@<name>
)。
<number>
当然,除非有人定义了一个名为的计数器,否则它一定不是\c@<number>
,但是我们可以得到但不是的<number style>
表达式!\c@<number>
<number>
\aAa
通常的定义\<number style>
是:
\def\<number style>#1{\expandafter\@<number style>\csname c@#1\endcsname
我已经\aAa
以同样的方式定义了,这将我们带到\@aAa
。
\@aAa
非常简单的部分是我使用了一些简单的 if 条件(伪代码):
if counter = 0 then
*
else if counter < 27
alph(counter - 26)
else if counter < 53
Alph(counter - 52)
else
counter - 52
end if
其中alph(arg)
/Alph(arg)
返回a
/ A
for arg = 1
、b
/ B
for arg = 2
,等等。
LaTeX 中的哪个“函数”(读作:宏)可以做到这一点?\@<number style>
可以。将返回名为(可能根本不存在)\<number style>{<arg>}
的计数器的值。\c@<arg>
(该宏\pagenumbering{<arg>}
重新定义\thepage
为\@<arg>\c@page
。)
代码
\documentclass{article}
\makeatletter
\def\aAa#1{\expandafter\@aAa\csname c@#1\endcsname}% LaTeX
\def\@aAa#1{%
\ifnum#1=0*%
\else\ifnum#1<27
\@alph{#1}%
\else\ifnum#1<53
\@Alph{\numexpr#1-26\relax}%
\else
\@arabic{\numexpr#1-52\relax}%
\fi
\fi
\fi
}
\makeatother
\usepackage{pgffor}% for the \foreach loop
\pagenumbering{aAa}
\newcounter{aAatest}
\renewcommand*{\theaAatest}{\aAa{aAatest}}
%\renewcommand*{\theaAatest}{{\fboxsep=0pt\fbox{\aAa{aAatest}}}}% test for spurious spaces
\usepackage[T1]{fontenc}% for correct \meaning output
\begin{document}
0: \theaAatest\par\setcounter{aAatest}{3}
3: \theaAatest\par\setcounter{aAatest}{51}
51: \theaAatest\par\setcounter{aAatest}{55}
55: \theaAatest
\medskip
\edef\x{\theaAatest}% expansion?
\meaning\x% gives:
\show\x% gives:
% > \x=macro:
% ->3.
% l.33 \show\x
\medskip
\foreach \i in {0,...,59}{
\setcounter{aAatest}{\i} \i: \theaAatest\par
}
\end{document}