十十二进制页码

十十二进制页码

我希望文档中的页码以 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 页图片

为什么 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函数生成A10 和B11 的数值,所以我们必须用符号替换字母。

输入\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\hexadecimalfmtcount

\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}

十二个演示1 十二个演示2 十二个演示3

相关内容