% \CheckSum{489} % \iffalse meta-comment % % This is file `alnumsec.dtx'. % % Copyright (C) 2003-2007 Frank Küster (frank@kuesterei.ch) % % -------------------------------------------------------------------------- % % This work may be distributed and/or modified under the % conditions of the LaTeX Project Public License, either version 1.3 % of this license or (at your option) any later version. % The latest version of this license is in % http://www.latex-project.org/lppl.txt % and version 1.3 or later is part of all distributions of LaTeX % version 2003/12/01 or later. % % This work has the LPPL maintenance status "maintained". % % This Current Maintainer of this work is Frank Küster. % % This work consists of the files README, alnumsec.ins, alnumsec.dtx, % and the derived file alnumsec.sty. % % \fi % % \iffalse % \charactertable % {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z % Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z % Digits \0\1\2\3\4\5\6\7\8\9 % Exclamation \! Double quote \" Hash (number) \# % Dollar \$ Percent \% Ampersand \& % Acute accent \' Left paren \( Right paren \) % Asterisk \* Plus \+ Comma \, % Minus \- Point \. Solidus \/ % Colon \: Semicolon \; Less than \< % Equals \= Greater than \> Question mark \? % Commercial at \@ Left bracket \[ Backslash \\ % Right bracket \] Circumflex \^ Underscore \_ % Grave accent \` Left brace \{ Vertical bar \| % Right brace \} Tilde \~} % \fi % % \iffalse %<*dtx> \ProvidesFile{alnumsec.dtx} % %\NeedsTeXFormat{LaTeX2e}[1995/12/01] %\ProvidesFile{alnumsec.drv} %\ProvidesPackage{alnumsec} [2007/07/27 v0.03 alphanumeric section numbers with ordinary sectioning commands] %<*driver> \documentclass{ltxdoc} \usepackage{hypdoc} \hypersetup{pdfkeywords={LaTeX,package,alnumsec},pdfstartview={}} \EnableCrossrefs \DoNotIndex{\@addtoreset,\@arabic,\@gobble,\@Alph,\@alph} \DoNotIndex{\@ctrerr,\@ifnextchar,\@ifstar,\@ifundefined} \DoNotIndex{\@minus,\@namedef,\@nameuse,\@nil} \DoNotIndex{\@onelevel@sanitize,\@plus,\@sptoken} \DoNotIndex{\@startsection} \DoNotIndex{\\,\ ,\|,\@tmpA,\@tmpB,\@tmpC} \DoNotIndex{\addtocounter,\alpha} \DoNotIndex{\AfterPackage,\arabic,\AtEndDocument,\AtBeginDocument,\author,\addchap} \DoNotIndex{\beta,\begin,\caption,\ClassError,\ClassWarning,\csname,\CurrentOption} \DoNotIndex{\c@experiment,\cfigure,\c@fk@argnumber,\c@paragraph,\c@subexperiment,\c@subparagraph,\c@subsection} \DoNotIndex{\centering,\chapter,\chi} \DoNotIndex{\DeclareOption,\def,\documentclass,\dots,\date,\delta} \DoNotIndex{\edef,\emph,\endinput,\epsilon,\eta} \DoNotIndex{\if,\else,\fi,\empty,\end,\endcsname,\expandafter} \DoNotIndex{\fbox,\FK@@sp@b,\FK@@sp@c,\FK@@sp@d,\FK@tempa,\FK@toks@,\FK@@sp@def,\frontmatter,\futurelet} \DoNotIndex{\fk@old@addcontentsline,\fk@old@appendix,\fk@old@backmatter} \DoNotIndex{\if@mainmatter,\fi,\ifnum,\fi} \DoNotIndex{\ifx,\fi,\input,\ifcase,\or,\fi,\iota} \DoNotIndex{\gamma,\kappa,\lambda} \DoNotIndex{\l@chapter,\l@section,\l@subsection,\l@experiment,\l@labday,\l@subexperiment,\label,\let,\LoadClass} \DoNotIndex{\maketitle,\MessageBreak,\mu} \DoNotIndex{\newcommand,\newcounter,\newif,\newtoks,\nobreak,\normalfont,\nu} \DoNotIndex{\othertext,\omega} \DoNotIndex{\par,\PassOptionsToClass,\printindex,\ProcessOptions,\PackageError,\pi,\psi} \DoNotIndex{\protect,\protected@edef,\protected@xdef,\providecommand} \DoNotIndex{\raggedsection,\refstepcounter,\relax,\renewcommand,\RequirePackage,\rule,\rho} \DoNotIndex{\@roman,\@Roman} \DoNotIndex{\sectfont,\setcounter,\size@section,\space,\stepcounter,\sigma} \DoNotIndex{\tableofcontents,\tau} \DoNotIndex{\title,\upsilon,\value,\varepsilon,\varphi,\vartheta} \DoNotIndex{\usepackage,\Xothertext,\Xsometext,\z@,\xi,\zeta} \CodelineIndex % \begin{document} \DocInput{alnumsec.dtx} \end{document} % % \fi % % \GetFileInfo{alnumsec.dtx} % \RecordChanges % % \MacroIndent=2em % \setcounter{IndexColumns}{2} % % \MakeShortVerb{\|} % \MakeShortVerb{\§} % % \title{alnumsec.sty: Using alphanumeric section numbering with % standard sectioning commands\texorpdfstring{\thanks{%^^A % This package has version number \fileversion, last revised \filedate.}}{}} % \author{Frank K\"uster\\ % \href{mailto:frank@kuesterei.ch}{\texttt{frank@kuesterei.ch}}} % \date{\filedate} % \maketitle{} % % \begin{abstract} % \noindent This package allows you to use alphanumeric section % numbering, e.g. A. Introduction; III. International Law. It's % output is similar to alphanum.sty, but you can use the standard % \LaTeX\ sectioning commands. Thus it is possible to switch numbering % schemes easily. Greek letters, double letters (bb) and different % delimiters around them are supported. % \end{abstract} % % \tableofcontents{} % \def\partname{Part} % % \clearpage % \part{User documentation} % \label{part:user-documentation} % % \section{Options} % \label{sec:options} % % There is only one option: If you specify |usehighlevels|, then the % numbers for every heading will start with the numbers of the superior % levels, as without the package (e.g. A.II.3.(a) Important Section). % Without the option, only the number of the current section level is % used, e.g. (a) Important Section. This seems to be common with % alphanumeric numbering. % % \section{Specifying the numbering scheme} % \label{sec:spec-numb-scheme} % % You specify the numbering scheme for the headings with the macro % \begin{verbatim} % \alnumsecstyle{} % \end{verbatim} % with the following specifiers: % \begin{center} % \begin{minipage}{0.8\textwidth}\renewcommand*{\thempfootnote}{\arabic{mpfootnote}} % \begin{description} % \item[a or n] stands for \textbf{arabic} number: 6 % \item[R] stands for an uppercase \textbf{Roman} number: VI % \item[r] stands for a lowercase \textbf{roman} number: vi % \item[L] stands for an uppercase \textbf{Letter}: A % \item[l] stands for a lowercase \textbf{letter}: a % \item[g] is for \textbf{greek} letter: $\alpha$ % \item[d] is for two lowercase letters (\textbf{doubleletter}): aa, bb % \item[b] for two greek letters (\textbf{doublegreek})\footnotemark: $\alpha\alpha$ % \end{description} % \end{minipage} % \end{center} % \footnotetext{The b is from \emph{bis}, latin for "twice", since the % greek word would also yield a \textbf{d}.} % % The numbers and letters are all followed by a period per default, if % you want to change this, use the macro % \begin{verbatim} % \surround{}{} % \end{verbatim} % Instead of ||, put the word given in boldface in the list above % (case matters!), || and || will be typeset around the % number of type name. % % If you use some number types twice, e.g. arabic numbers for the second % and fifth level: |\alnumsecstyle{LaRla}|, you might want to % distinguish between the two numbers by their separators. To achieve % this, you give the separators for lower levels in the optional % argument(s) to |\surround|. In the example, you might use % |\surroundarabic[(]{}{)}| to achieve A. 2) III. d. (4) or % |\surroundarabic[(][)]{}{.}| for A. 2. III. d. (4). Note, however, % that alnumsec does \emph{not} recognize that a number type has yet % been used and that it now should use the alternative separators. % Instead, you have to specify the first level for which alternative % separators should be used with the command % |\otherseparators{}|. In \LaTeX, chapter, if defined, has % level 0, section has 1 and so on down to subparagraph with level % 5. Therefore, in the above example, |\otherseparators{5}| would % work, but |\otherseparators{3}| as well. % % Please note that |\alnumsecstyle| does not change the numbering % scheme of figures or tables (yet). % So if a |report| or |book| like document class will be used, % one can get double periods there. % But this can be corrected easily, for example the |figure| counter % representation is usually defined as something like % \begin{quote} % |\newcommand\thefigure{%|\\ % | \ifnum\value{chapter}>0 \thechapter.\fi \arabic{figure}}| % \end{quote} % So to remove the extra period here one can insert % \begin{quote} % |\renewcommand\thefigure{%|\\ % | \ifnum\value{chapter}>0 \thechapter\fi \arabic{figure}}| % \end{quote} % right after the use of |\alnumsecstyle|. (same for tables) % % % \section{Sectioning levels to use} % \label{sec:sect-levels-use} % % Many people that use alphanumeric sectioning numbers also seem to use % many, many levels of sectioning commands - alnumsec.sty can handle % this. If you only use the levels that are defined in the standard % classes (i.e. from |\chapter| or |\section| to |\subparagraph|), you % don't have to do anything. |\part| is not treated at all by % alnumsec.sty. % %\newcommand*{\labday}{\textbackslash\texttt{labday}}\newcommand*{\experiment}{\textbackslash\texttt{experiment}} %\newcommand*{\typesection}{\textbackslash\texttt{section}}\newcommand*{\typechapter}{\textbackslash\texttt{chapter}} % If you have more (or simply other\footnote{With other, I mean other % names for the same concept -- e.g. my labbook.cls uses \labday\ % instead of \typechapter\ and \experiment\ instead of \typesection. % Different concepts, as e.g. in alphanum.sty, won't work. But anyway, % you'll only want to use one of both.}) sectioning macros, you have % to tell alnumsec about their names and whether the first is on % \LaTeX{}s level 0 (like chapter) or 1 (like section). This is done % with the macro |\alnumsectionlevels| - here is what the package uses % for the article class: % \begin{verbatim} % \alnumsectionlevels{1}{section,subsection,subsubsection,paragraph,subparagraph} % \end{verbatim} % % If you use this macro, you have to do it \emph{before} % |\alnumsecstyle|!\smallskip % % alnumsec.sty assumes that the number is typeset using |\the| for % section level ||. This will always be the case if the macro has % been defined using the \LaTeX\ macro designed for this, % |\@startsection|. % % % \section{Bugs and Limitations} % \label{sec:bugs-limitations} % % Currently I am not aware of any real bugs, but one could imagine a lot % of more features. However, since I wrote this package for somebody % else's needs and don't use it myself, I need input from users to be % able to improve it. % % \StopEventually{\PrintIndex\PrintChanges} % % \clearpage % \part{Implementation} % % % % \begin{macrocode} %<*alnumsec> \newif\ifusepreviouslevels\usepreviouslevelsfalse% \DeclareOption{usehighlevels}{\usepreviouslevelstrue}% \ProcessOptions% \RequirePackage{ifthen}% % \end{macrocode} % % Macros for greek "numbers" and double letters: % \changes{v0.03}{2007/07/27}{Define \cs{@greek} et al with \cs{providecommand}} % % \begin{macrocode} \providecommand*{\@greek}[1]{\ifcase#1\relax\or$\alpha$\or$\beta$\or $\gamma$\or$\delta$\or$\varepsilon$\or$\zeta$\or$\eta$\or$\vartheta$\or $\iota$\or$\kappa$\or$\lambda$\or$\mu$\or$\nu$\or$\xi$\or$o$\or$\pi$\or $\rho$\or$\sigma$\or$\tau$\or$\upsilon$\or$\varphi$\or$\chi$\or$\psi$\or $\omega$\else\@ctrerr\fi}% \providecommand*{\@doublegreek}[1]{\@greek{#1}{\@greek{#1}}} \providecommand*{\@doublealph}[1]{\@alph{#1}{\@alph{#1}}} \newcounter{alnumsec@level}% \newcounter{fk@secdepth}% \newcounter{fk@secstart}% \newcounter{fk@changelevel}\setcounter{fk@changelevel}{20}% % \end{macrocode} % % |alnumsec@level| is the dynamic counter used while browsing through % the levels. |fk@secdepth| is the number of sectioning levels for % which names are known and thus numbers can be assigned. |fk@secstart| % will be the starting value for every use of |alnumsec@level|, i.e. it % will be 0 if |\chapter|\footnote{or some other macro on the level 0} % is defined and 1 otherwise. |fk@changelevel| is the level from which % the alternative separators for lower levels will be used. It is % initially set very high so that lower level separators won't be used % unless this counter is changed, using the following command: % % \begin{macrocode} \def\otherseparators#1{% \setcounter{fk@changelevel}{#1} } % \end{macrocode} % % |\alnumsectionlevels| is the command for users that have more or % different than the usual section names. The main work is done by % |\fk@countlevels|, after that |fk@secdepth| is set to the number of % known levels. % % \begin{macrocode} \def\alnumsectionlevels#1#2{% \setcounter{fk@secstart}{#1} \setcounter{alnumsec@level}{#1}% \fk@countlevels#2,\relax,% \setcounter{fk@secdepth}{\value{alnumsec@level}}% \addtocounter{fk@secdepth}{-1} } % \end{macrocode} % % |\fk@countlevels| goes through the comma separated list of level names % until it encounters the relax that has been put at the end by % |\alnumsectionlevels|. For each level, it puts this name into a % "numbered" name, e.g. |\fk@levelname1|, and increases the counter. % % \begin{macrocode} \def\fk@countlevels#1,{% \ifx\relax#1% \empty% \else% \expandafter\def\csname fk@levelname\thealnumsec@level\endcsname{#1}% \stepcounter{alnumsec@level}% \expandafter\fk@countlevels% \fi% } % \end{macrocode} % % |\alnumsecstyle| is the macro with which the user specifies the % numbering scheme and, implicitly, the level of the last numbered % section. It feeds its argument to |\fk@scanstyle| and later sets % |secnumdepth|. This counter has to be lowered by one because % |\fk@scanstyle| increments |alnumsec@level| \emph{after} it has parsed % each letter, so after the last letter it is incremented once more. % Then |\fk@assignstyle| is called which actually defines |\thesection| % and friends. % % \begin{macrocode} \def\alnumsecstyle#1{% \setcounter{alnumsec@level}{\value{fk@secstart}}% \fk@scanstyle#1\relax% \setcounter{secnumdepth}{\value{alnumsec@level}}% \addtocounter{secnumdepth}{-1}% \setcounter{alnumsec@level}{\value{fk@secstart}}% \fk@assignstyle% }% \def\fk@scanstyle#1{% \ifx\relax#1% \relax% \else% \ifnum\c@alnumsec@level>\c@fk@secdepth% \PackageError{alnumsec}{% more numbering levels than sectioning levels}{% You have specified \thealnumsec@level\space different numbering styles.\MessageBreak However, only \thefk@secdepth\space sectioning commands have been defined, down to \csname fk@levelname\thefk@secdepth\endcsname. }% \else% \fk@whichstyle{#1}% \stepcounter{alnumsec@level}% \fi% \expandafter\fk@scanstyle% \fi% } \newif\iffk@letterknown\fk@letterknownfalse \def\fk@whichstyle#1{% \if R#1% \fk@defsecstyle{\thealnumsec@level}{\@Roman}{Roman}% \fk@letterknowntrue \fi% \if r#1% \fk@defsecstyle{\thealnumsec@level}{\@roman}{roman}% \fk@letterknowntrue \fi% \if n#1% \fk@defsecstyle{\thealnumsec@level}{\@arabic}{arabic}% \fk@letterknowntrue \fi% \if a#1% \fk@defsecstyle{\thealnumsec@level}{\@arabic}{arabic}% \fk@letterknowntrue \fi% \if L#1% \fk@defsecstyle{\thealnumsec@level}{\@Alph}{Letter}% \fk@letterknowntrue \fi% \if l#1% \fk@defsecstyle{\thealnumsec@level}{\@alph}{letter}% \fk@letterknowntrue \fi% \if g#1% \fk@defsecstyle{\thealnumsec@level}{\@greek}{greek}% \fk@letterknowntrue \fi% \if d#1% \fk@defsecstyle{\thealnumsec@level}{\@doublealph}{doubleletter}% \fk@letterknowntrue \fi% \if b#1% \fk@defsecstyle{\thealnumsec@level}{\@doublegreek}{doublegreek}% \fk@letterknowntrue \fi% \iffk@letterknown\else% \PackageError{alnumsec}{unknown specifier: #1}{% You have given #1 as specifier for the numbering scheme.\MessageBreak Only the following are known:\MessageBreak nrRLldgb } \fi } \def\fk@defsecstyle#1#2#3{% \edef\fk@seclevel{\csname fk@levelname#1\endcsname}% \expandafter\def\csname fk@\thealnumsec@level num\endcsname{#2}% \ifnum\c@alnumsec@level<\c@fk@changelevel% \expandafter\def% \csname fk@pre@\thealnumsec@level\expandafter\endcsname\expandafter{% \csname fk@pre@#3\endcsname}% \expandafter\def% \csname fk@post@\thealnumsec@level\expandafter\endcsname\expandafter{% \csname fk@post@#3\endcsname}% \else% \expandafter\def% \csname fk@lower@pre@\thealnumsec@level\expandafter\endcsname\expandafter{% \csname fk@lower@pre@#3\endcsname}% \expandafter\def% \csname fk@lower@post@\thealnumsec@level\expandafter\endcsname\expandafter{% \csname fk@lower@post@#3\endcsname}% \fi% }% % \end{macrocode} % % In |\fk@assignstyle|, the first level has to be treated differently to % allow the use of the previous levels for the lower levels. % % \begin{macrocode} \def\fk@assignstyle{% \edef\fk@secname{\csname fk@levelname\thefk@secstart\endcsname}% \expandafter\@namedef{the\fk@secname\expandafter}\expandafter{% \csname fk@pre@\thealnumsec@level\expandafter\endcsname% \csname fk@\thefk@secstart num\expandafter\endcsname% \csname c@\fk@secname\expandafter\endcsname% \csname fk@post@\thealnumsec@level\expandafter\endcsname% }% \whiledo{% \c@alnumsec@level<\c@secnumdepth% }{% \stepcounter{alnumsec@level}% \let\fk@previoussecname\fk@secname% \edef\fk@secname{% \csname fk@levelname\thealnumsec@level\endcsname}% \ifusepreviouslevels% \ifnum\c@alnumsec@level<\c@fk@changelevel% \expandafter\@namedef{the\fk@secname\expandafter}\expandafter{% \csname the\fk@previoussecname\expandafter\endcsname \csname fk@pre@\thealnumsec@level\expandafter\endcsname% \csname fk@\thealnumsec@level num\expandafter\endcsname% \csname c@\fk@secname\expandafter\endcsname% \csname fk@post@\thealnumsec@level\endcsname}% \else% \expandafter\@namedef{the\fk@secname\expandafter}\expandafter{% \csname the\fk@previoussecname\expandafter\endcsname \csname fk@lower@pre@\thealnumsec@level\expandafter\endcsname% \csname fk@\thealnumsec@level num\expandafter\endcsname% \csname c@\fk@secname\expandafter\endcsname% \csname fk@lower@post@\thealnumsec@level\endcsname}% \fi% \else% % \end{macrocode} % % The following three lines are added to have references with parents, % thanks to Markus Kohm. \changes{v0.02}{2005/02/16}{Added code to % make references complete, thanks to Markus Kohm.} % % \begin{macrocode} \expandafter\@namedef{p@\fk@secname\expandafter}\expandafter{% \csname p@\fk@previoussecname\expandafter\endcsname \csname the\fk@previoussecname\endcsname}% \ifnum\c@alnumsec@level<\c@fk@changelevel% \expandafter\@namedef{the\fk@secname\expandafter}\expandafter{% \csname fk@pre@\thealnumsec@level\expandafter\endcsname% \csname fk@\thealnumsec@level num\expandafter\endcsname% \csname c@\fk@secname\expandafter\endcsname% \csname fk@post@\thealnumsec@level\endcsname}% \else% \expandafter\@namedef{the\fk@secname\expandafter}\expandafter{% \csname fk@lower@pre@\thealnumsec@level\expandafter\endcsname% \csname fk@\thealnumsec@level num\expandafter\endcsname% \csname c@\fk@secname\expandafter\endcsname% \csname fk@lower@post@\thealnumsec@level\endcsname}% \fi% \fi% }% } \def\define@surroundstyle#1{% \@namedef{surround#1}{% \@ifnextchar [{%] \csname opt@surround#1\endcsname}{% \csname nopt@surround#1\endcsname}% }% \@namedef{opt@surround#1}[##1]{% \@ifnextchar [{%] \csname dopt@surround#1\endcsname[##1]}{% \csname @opt@surround#1\endcsname[##1]} } \@namedef{dopt@surround#1}[##1][##2]##3##4{% \@namedef{fk@lower@pre@#1}{##1}% \@namedef{fk@lower@post@#1}{##2}% \@namedef{fk@pre@#1}{##3}% \@namedef{fk@post@#1}{##4}% } \@namedef{@opt@surround#1}[##1]##2##3{% \relax \@namedef{fk@lower@pre@#1}{##1}% \@namedef{fk@pre@#1}{##2}% \@namedef{fk@post@#1}{##3}% \expandafter\let% \csname fk@lower@post@#1\expandafter\endcsname% \csname fk@post@#1\endcsname% } \@namedef{nopt@surround#1}##1##2{% \@namedef{fk@pre@#1}{##1}% \@namedef{fk@post@#1}{##2}% \expandafter\let% \csname fk@lower@pre@#1\expandafter\endcsname% \csname fk@pre@#1\endcsname% \expandafter\let% \csname fk@lower@post@#1\expandafter\endcsname% \csname fk@post@#1\endcsname% } } \define@surroundstyle{Roman} \define@surroundstyle{roman} \define@surroundstyle{Letter} \define@surroundstyle{letter} \define@surroundstyle{arabic} \define@surroundstyle{doubleletter} \define@surroundstyle{greek} \define@surroundstyle{doublegreek} \newif\iffk@chapterdefined% \@ifundefined{chapter}{% \fk@chapterdefinedfalse% \setcounter{fk@secstart}{1}% \setcounter{fk@secdepth}{5}% \alnumsectionlevels{1}{section,subsection,subsubsection,paragraph,subparagraph}% }{% \fk@chapterdefinedtrue% \setcounter{fk@secstart}{0}% \setcounter{fk@secdepth}{5}% \alnumsectionlevels{0}{chapter,section,subsection,subsubsection,paragraph,subparagraph}% } \iffk@chapterdefined% \def\fk@pre@chapter{}% \def\fk@post@chapter{.}% \fi \surroundRoman{}{.} \surroundroman{}{.} \surroundarabic{}{.} \surroundLetter{}{.} \surroundletter[(]{}{)} \surroundgreek[(]{}{)} \surrounddoubleletter[(]{}{)} \surrounddoublegreek[(]{}{)} % % \end{macrocode} % % \clearpage % \Finale % \endinput