不寻常的编号:结合 alph、Alph、arabic

不寻常的编号:结合 alph、Alph、arabic

我想要一个不寻常的编号,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/ Afor arg = 1b/ Bfor 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}

输出

在此处输入图片描述

相关内容