我希望文档中的页码以 12 进制表示。以下是 MWE
\documentclass[12pt]{article}
\usepackage[paperheight=1.8in, textheight=0.8in]{geometry}
\newcommand{\sirdot}{$\odot$}
\newcommand{\apple}{$\Delta$}
\begin{document}
The duodecimal numbers:
\begin{center}
1, 2, \ldots, 8, 9, \sirdot, \apple, 10, 11, \ldots, 19, 1\sirdot,
1\apple, 20, 21, \ldots, \apple 9, \apple\sirdot, \apple\apple, 100 \ldots
\end{center}
\setcounter{page}{10}
Set page counter to 10, so this should be page \sirdot.
\newpage
This should be page \apple.
\newpage
This should be page 10.
\end{document}
为什么 10 和 11 有这些特殊符号?请参阅 http://www.cs.umb.edu/~eb/sam/duodecimal/ssegm.pdf。
我的文档不太可能需要三位数的页码,这可能会导致不太雅致的黑客解决方案。
附加问题:\sirdot
看起来线的位置有点太低了。
答案1
使用expl3
它相当容易(并且没有数字限制,除了通常的 2147483647,TeX 中的最大数字)
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\basetwelve}{m}
{ \duodec_convert:n { #1 } }
\tl_new:N \l_duodec_string_tl
\cs_new_protected:Npn \duodec_convert:n #1
{
\tl_set:Nx \l_duodec_string_tl { \int_to_base:nn { #1 } { 12 } }
\tl_replace_all:Nnn \l_duodec_string_tl { A } { $\odot$ }
\tl_replace_all:Nnn \l_duodec_string_tl { B } { $\Delta$ }
\tl_use:N \l_duodec_string_tl
}
\ExplSyntaxOff
\renewcommand{\thepage}{\basetwelve{\arabic{page}}}
\begin{document}
\ExplSyntaxOn
\int_step_inline:nnnn { 1 } { 1 } { 145 }
{ \basetwelve{#1} ~ }
\ExplSyntaxOff
\end{document}
代码位于序言中,之后是测试,用于显示数字是否按照请求的形式正确生成。
该\int_to_base:nn
函数生成A
10 和B
11 的数值,所以我们必须用符号替换字母。
输入\basetwelve{123456}
产生 5∆540。
我们该怎么做?我们定义一个强大的命令,\basetwelve
它将包装对转换的调用,由执行\duodec_convert:n
。此命令将最终扩展为十进制数的某些内容作为输入(例如,\arabic{page}
并通过函数将转换为十二进制形式的数字 0123456789AB 存储起来\int_to_base:nn
。然后我们用替换所有 A $\odot$
,用替换所有 B,$\Delta$
并提供转换后的标记列表。
当 LaTeX 想要将页码写入.aux
文件时,它会扩展\thepage
,得到\basetwelve{\arabic{page}}
。由于 是\basetwelve
健壮的(所有用 定义的命令\NewDocumentCommand
都是),它将被原封不动地写入。相反,它将\arabic{page}
被扩展为当前页码,因此写入文件中的内容.aux
是\basetwelve{23}
。当使用它时,\pageref
将执行转换,给出 1∆。
答案2
这是一个使用的解决方案fmtcount
包加上一个以 为模型的新宏\duodecimal
。(实际上,这是一个货物崇拜编程的例子:我基本上采用了宏集,并将“hexa”替换为“duo”,将“16”替换为“12”,将“65536”[16^4] 替换为“20736”[12^4]。)fmtcount
\hexadecimal
fmtcount
\documentclass[12pt]{article}
\usepackage[paperheight=1.8in, textheight=0.8in]{geometry}
\newcommand{\sirdot}{$\odot$}
\newcommand{\apple}{$\Delta$}
\usepackage{fmtcount}
\makeatletter
\newcommand*{\@@duodecimal}[1]{\ifcase#10\or1\or2\or3\or4\or5\or
6\or7\or8\or9\or $\odot$\or $\Delta$\fi}
\newcommand*{\@duodecimal}[1]{%
\@DT@padzeroestrue
\@DT@loopN=5\relax
\@strctr=\@DT@loopN
\whiledo{\@strctr<\c@padzeroesN}{0\advance\@strctr by 1}%
\@strctr=20736\relax
\@DT@X=#1\relax
\loop
\@DT@modctr=\@DT@X
\divide\@DT@modctr by \@strctr
\ifthenelse{\boolean{@DT@padzeroes}\and\(\@DT@modctr=0\)\and
\(\@DT@loopN>\c@padzeroesN\)}{}{\@@duodecimal\@DT@modctr}%
\ifnum\@DT@modctr=0\else\@DT@padzeroesfalse\fi
\multiply\@DT@modctr by \@strctr
\advance\@DT@X by -\@DT@modctr
\divide\@strctr by 12\relax
\advance\@DT@loopN by -1\relax
\ifnum\@strctr>1
\repeat
\@@duodecimal\@DT@X}
\let\duodecimalnum=\@duodecimal
\providecommand*{\duodecimal}[1]{%
\expandafter\protect\expandafter\@duodecimal{%
\expandafter\the\csname c@#1\endcsname}}
\makeatother
\renewcommand*{\thepage}{\duodecimal{page}}
\begin{document}
The duodecimal numbers:
\begin{center}
1, 2, \ldots, 8, 9, \sirdot, \apple, 10, 11, \ldots, 19, 1\sirdot,
1\apple, 20, 21, \ldots, \apple 9, \apple\sirdot, \apple\apple, 100 \ldots
\end{center}
\setcounter{page}{10}
Set page counter to 10, so this should be page \sirdot.
\newpage
This should be page \apple.
\newpage
This should be page 10.
\end{document}
答案3
这是第一次尝试,它依赖于你只需要两位数的页码。因此,此解决方案仅适用于 144 页:
\documentclass{article}
\usepackage[paperheight=50pt,paperwidth=5em,footskip=-10em]{geometry}%
\usepackage[nomessages]{fp}% http://ctan.org/pkg/fp
\newcommand{\basetwelve}[1]{%
\vphantom{0}\ifcase#1
0\or1\or2\or3\or4\or5\or6\or7\or8\or9\or\smash{\raisebox{.2ex}{$\odot$}}\or\smash{$\Delta$}%
\fi%
}
\newcounter{duo}%
\renewcommand{\thepage}{%
\setcounter{duo}{\value{page}}%
\FPeval\remainder{clip(\theduo-(12*round(\theduo/12-.5:0)))}%
\FPeval\result{clip(round(\theduo/12-.5:0))}%
\ifnum\result=0\else\basetwelve\result\fi\basetwelve\remainder%
}
\newcommand{\npage}{\mbox{}\newpage}
\pagestyle{plain}%
\begin{document}
\npage\npage\npage\npage\npage\npage\npage\npage\npage\npage
\npage\npage\npage\npage\npage\npage\npage\npage\npage\npage
\npage\npage\npage\npage\npage\npage\npage\npage\npage\npage
\npage\npage\npage\npage\npage\npage\npage\npage\npage\npage
\end{document}
\basetwelve{<num>}
其工作方式类似于查找函数,根据输入值返回 0,1,...,9,“10”,“11”。\result
包含页码的第一位数字和\remainder
第二位数字。fp
用于执行以 12 为底的模计算。
\smash
非数字符号的高度调整是使用和的组合进行的,对于小于 12 的数字,\raisebox
则使用 。\vphantom{0}
geometry
设置仅用于此示例。
答案4
\dozens
该包中已经提供了一个 LaTeX2e 实现的十几个转换器,dozenal
它可以完成 @egregs 的工作\basetwelve
:
\documentclass{article}
\usepackage{dozenal}
\renewcommand{\x}{$\odot$}
\renewcommand{\e}{$\Delta$}
\renewcommand{\thepage}{\dozens{\arabic{page}}}
\let\sirdot\x
\let\apple\e
\begin{document}
\setcounter{page}{10}
Set page counter to $10_{10}$, so this should be page \sirdot.
\newpage
This should be page \apple.
\newpage
This should be page 10.
\end{document}