Skip to content

Instantly share code, notes, and snippets.

@zr-tex8r
Last active August 10, 2019 01:51
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save zr-tex8r/2d8a8c38a35b19191e9a8a8f60747bcc to your computer and use it in GitHub Desktop.
Save zr-tex8r/2d8a8c38a35b19191e9a8a8f60747bcc to your computer and use it in GitHub Desktop.
LaTeX: カウンタの出力書式を☃の“変態3進法”にする
%%
%% This is file 'scternoidal.sty'.
%%
%% Copyright (c) 2018 Takayuki YATO (aka. "ZR")
%% GitHub: https://github.com/zr-tex8r
%% Twitter: @zr_tex8r
%%
%% This package is distributed under the MIT License.
%%
%% package declarations
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{scternoidal}[2018/01/18 v0.8]
\def\scztd@pkgname{scternoidal}
%--------------------------------------- general
%% packages
\RequirePackage{pdftexcmds}[2009/09/23]% v0.6
\RequirePackage{etoolbox}[]
\ifx\numdef\@undefined \endinput \fi
%% unique tokens
\def\scztd@end{\scztd@end@}
\def\scztd@mt{\scztd@mt@}
\let\scztd@mk\indent % unexpandable
%% variables
\newif\ifscztd@scsnowman
\newif\ifscztd@unicode
\newif\ifscztd@uptex
%% engine check
\scztd@unicodefalse
\pdf@isprimitive\XeTeXversion\XeTeXversion{\scztd@unicodetrue}{}
\pdf@isprimitive\luatexversion\luatexversion{\scztd@unicodetrue}{}
\scztd@uptexfalse
\pdf@isprimitive\forcecjktoken\forcecjktoken{\scztd@uptextrue}{}
%% \scztd@cond\ifXXX..\fi{<true>}{<false>}
\@gobbletwo\if\if \def\scztd@cond#1\fi{%
#1\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi}
%--------------------------------------- options
%% declaratons
% '(no)scsnowman'
\DeclareOption{noscsnowman}{%
\scztd@scsnowmanfalse}
\DeclareOption{scsnowman}{%
\scztd@scsnowmantrue}
%% dispatch
\ExecuteOptions{scsnowman}
\ProcessOptions*
%% postprocess
\ifscztd@scsnowman
\RequirePackage{scsnowman}[]
\fi
%--------------------------------------- ternoidal expansion
\catcode`\:=3
%% \scztd@ternoidal{<number>}
\def\scztd@ternoidal#1{%
\expandafter\scztd@ternoidal@a\number#1:}
\def\scztd@ternoidal@a#1:{%
\scztd@cond\ifnum#1<\z@\fi{}{%else
\scztd@three@divide{#1}0\scztd@ternoidal@b}}
\def\scztd@ternoidal@b#1:{%
\scztd@prepend@digit{#1}0{}\scztd@ternoidal@c}
\def\scztd@ternoidal@c#1:#2:{%
\scztd@cond\ifnum#2=\z@\fi{#1}{%else
\scztd@three@divide{#2}1\scztd@ternoidal@d#1:}}
\def\scztd@ternoidal@d#1:#2:#3:{%
\scztd@prepend@digit{#1}1{#3}\scztd@ternoidal@c#2:}
%% \@scternoidal
% Required by '\pagenumbering`.
\let\@scternoidal\scztd@ternoidal
%% \scztd@eval\CScont{<expr>}
\def\scztd@eval#1{%
\expandafter#1\the\numexpr}
%% \scztd@three@divide{<number>}{<min-rem>}\CScont
\def\scztd@three@divide#1#2{%
\scztd@eval\scztd@three@divide@a#1-#1/3*3:#1/3:#2:}
\def\scztd@three@divide@a#1:#2:#3:{%
\scztd@cond\ifnum#1<#3 \fi{%
\scztd@eval\scztd@three@divide@a#1+3:#2-1:#3:%
}{\scztd@eval\scztd@three@divide@b#2:#1:}}
\def\scztd@three@divide@b#1:#2:#3{%
#3#2:#1:}
%% \scztd@prepend@digit{<number>}{<min-digit>}{<text>}\CScont
\def\scztd@prepend@digit#1#2{%
\scztd@eval\scztd@prepend@digit@a#1-#2:}
\def\scztd@prepend@digit@a#1:{%
\scztd@cond\ifnum#1=0 \fi{\scztd@prepend@digit@b\scztdWhiteSnowman}{%
\scztd@cond\ifnum#1=1 \fi{\scztd@prepend@digit@b\scztdWhiteSSnowman}{%
\scztd@cond\ifnum#1=2 \fi{\scztd@prepend@digit@b\scztdBlackSSnowman}{%
\scztd@prepend@digit@b?}}}}
\def\scztd@prepend@digit@b#1#2#3{%
#3#1#2:}
\catcode`\:=12
%--------------------------------------- essential digits
%% \scztdWhiteSnowman: the digit zero
\newcommand*\scztdWhiteSnowman{}
%% \scztdWhiteSSnowman: the digit one
\newcommand*\scztdWhiteSSnowman{}
%% \scztdBlackSSnowman: the digit two
\newcommand*\scztdBlackSSnowman{}
%% the definitions on Unicode engines
\ifscztd@unicode
\chardef\scztdWhiteSnowman="26C4
\chardef\scztdWhiteSSnowman="2603
\chardef\scztdBlackSSnowman="26C7
%% otherwise we assume 'utf8' input encoding
\else
\begingroup
\catcode33=7
\catcode"E2=\active \catcode"98=\active \catcode"83=\active
\catcode"9B=\active \catcode"84=\active \catcode"87=\active
\protected\gdef\scztdWhiteSnowman{^^e2^^9b^^84}
\protected\gdef\scztdWhiteSSnowman{^^e2^^98^^83}
\protected\gdef\scztdBlackSSnowman{^^e2^^9b^^87}
\endgroup
\fi
%% \scztd@hy@***
% The definition used in PDF strings.
\DeclareTextCommand{\scztd@hy@WhiteSnowman}{PU}{\9046\304}% U+26C4
\DeclareTextCommand{\scztd@hy@WhiteSSnowman}{PU}{\9046\003}% U+2603
\DeclareTextCommand{\scztd@hy@BlackSSnowman}{PU}{\9046\307}% U+26C7
\DeclareTextCommand{\scztd@hy@WhiteSnowman}{PD1}{\scztd@hy@fallback}
\DeclareTextCommand{\scztd@hy@WhiteSSnowman}{PD1}{\scztd@hy@fallback}
\DeclareTextCommand{\scztd@hy@BlackSSnowman}{PD1}{\scztd@hy@fallback}
\def\scztd@hy@fallback{8}
%% setup for upTeX
% Here we use Japanese tokens.
\ifscztd@uptex %<*upTeX>
\begingroup
\kansujichar0="26C4
\kansujichar1="2603
\kansujichar2="26C7
\xdef\scztdWhiteSnowman{\kansuji0}
\xdef\scztdWhiteSSnowman{\kansuji1}
\xdef\scztdBlackSSnowman{\kansuji2}
\endgroup
\let\scztd@hy@WhiteSnowman\scztdWhiteSnowman
\let\scztd@hy@WhiteSSnowman\scztdWhiteSSnowman
\let\scztd@hy@BlackSSnowman\scztdBlackSSnowman
\fi %</upTeX>
%% setup in 'scsnowman' mode
\ifscztd@scsnowman
\def\scztd@scsnowman@digit#1#2{%
\raisebox{-0.1728ex}{\scsnowman[%
hat,arms,muffler,scale=1.2,snow=#1,body=#2]}}
\protected\def\scztdWhiteSnowman{\scztd@scsnowman@digit{false}{false}}
\protected\def\scztdWhiteSSnowman{\scztd@scsnowman@digit{true}{false}}
\protected\def\scztdBlackSSnowman{\scztd@scsnowman@digit{true}{true}}
\fi
%% setup for hyperref
\providecommand*\pdfstringdefPreHook{}
\appto\pdfstringdefPreHook{%
\let\scztdWhiteSnowman\scztd@hy@WhiteSnowman
\let\scztdWhiteSSnowman\scztd@hy@WhiteSSnowman
\let\scztdBlackSSnowman\scztd@hy@BlackSSnowman}
%--------------------------------------- user interface
%%<*> \scternoindalof{<number>}
\newcommand*\scternoidalof[1]{%
\scztd@ternoidal{#1}}
%%<*> \scternoindal{<counter>}
\newcommand*\scternoidal[1]{%
\expandafter\scztd@ternoidal\csname c@#1\endcsname}
%--------------------------------------- all done
\endinput
%% EOF
% pLaTeX文書
% ↓scsnowmanを利用するのでドライバ指定が必須
\documentclass[dvipdfmx]{jsarticle}
\usepackage{scternoidal}
% 1段目enumerateの項番をscternoidalにする
\renewcommand{\theenumi}{\scternoidal{enumi}}
\begin{document}
トッテモ有益なパッケージの例:
\begin{enumerate}
\item scsnowman \label{nantoka}
\item Gotoh
\item lisp-on-tex
\item tcfaspin
\item tikzducks \label{kantoka}
\end{enumerate}
% 相互参照の番号もscternoidalになる
特に\ref{nantoka}と\ref{kantoka}は重要。
\end{document}
% LuaLaTeX文書; UTF-8
\documentclass[a4paper]{ltjsarticle}
% LuaLaTeXなのでunicode指定が必要
% 栞にも節番号を付ける(bookmarksnumbered指定)
\usepackage[unicode,hidelinks,bookmarksnumbered]{hyperref}
\usepackage{scternoidal}
% 節番号をscternoidalにする
\renewcommand{\thesection}{\scternoidal{section}}
\begin{document}
\section{\TeX}
Knuthが作った組版ソフトウェア。超絶アレ。
\section{plain {\TeX}}
Knuthによる{\TeX}のマクロパッケージ。結局アレ。
\section{\LaTeX}
Lamportが作った{\TeX}のマクロパッケージ。微アレ。
\section{ゆきだるま}
雪玉を重ねて作るやつ。非アレ。
\section{アヒル}
……に関する言及は控えさせて頂きます。
\end{document}
% XeLaTeX文書; UTF-8
\documentclass[xelatex,ja=standard,a4paper]{bxjsbook}
\usepackage[unicode,hidelinks]{hyperref}
\usepackage{scternoidal}
% ページ番号をscternoidalにする
\pagenumbering{scternoidal}
\usepackage{bxjalipsum}% 例のアレ
\begin{document}
\chapter{吾輩は猫である}
\jalipsum[1-16]{wagahai}
\end{document}
% upLaTeX文書; UTF-8
\documentclass[uplatex,dvipdfmx,a4paper]{jsbook}% ドライバ指定
\usepackage[unicode,hidelinks]{hyperref}% 'unicode'が必要!
\usepackage{pxjahyper}% 0.3a版以降が必須
\usepackage{scternoidal}
\pagenumbering{scternoidal}
\usepackage{bxjalipsum}
\begin{document}
\chapter{吾輩は猫である}
\jalipsum[1-16]{wagahai}
\end{document}
@zr-tex8r
Copy link
Author

(クリックしてマクロツイーターへのリンクを入力)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment