summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/latex/secnum
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/source/latex/secnum')
-rw-r--r--Master/texmf-dist/source/latex/secnum/secnum.dtx470
1 files changed, 470 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/latex/secnum/secnum.dtx b/Master/texmf-dist/source/latex/secnum/secnum.dtx
new file mode 100644
index 00000000000..5d2fe91f37b
--- /dev/null
+++ b/Master/texmf-dist/source/latex/secnum/secnum.dtx
@@ -0,0 +1,470 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 2019
+% Gau, Syu ( GauSyu@Gmail.com )
+%
+% ----------------------------------------------------------------------
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either
+% version 1.3c of this license or (at your option) any later
+% version. This version of this license is in
+% http://www.latex-project.org/lppl/lppl-1-3c.txt
+% and 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 2005/12/01 or later.
+%
+% This work has the LPPL maintenance status `maintained'.
+%
+% The Current Maintainer of this work is
+% Gau, Syu ( GauSyu@Gmail.com ).
+%
+% ----------------------------------------------------------------------
+%
+%<*internal>
+\iffalse
+%</internal>
+%<*readme>
+
+# secnum
+
+This package provides a macro \setsecnum to format section numbering intuitively.
+
+## Installation
+
+The installation is the same as usual Tex packages.
+
+0. Put the source file `secnum.dtx` in a empty folder and go to there.
+
+1. Run the following to create the package file `secnum.sty` (as well as this file `README.md`)
+
+ XeTeX secnum.dtx
+
+2. Move the following file into proper directories searched by TeX.
+ The recommended directory is
+
+ tex/latex/secnum
+
+3. To produce the documentation run the following
+
+ XeLaTeX secnum.dtx
+
+4. The recommended directory for the documentation is
+
+ doc/latex/secnum
+
+## Download
+
+One can also download the generated files from the [github release](https://github.com/GauSyu/secnum/releases).
+
+%</readme>
+%<*internal>
+\fi
+\begingroup
+ \def\nameoflatexe{LaTeX2e}
+\expandafter\endgroup\ifx\nameoflatexe\fmtname\else
+\csname fi\endcsname
+%</internal>
+%<*install>
+
+\input docstrip.tex
+
+\preamble
+
+Copyright (C) 2019
+Gau, Syu ( GauSyu@Gmail.com )
+
+----------------------------------------------------------------------
+
+This work may be distributed and/or modified under the
+conditions of the LaTeX Project Public License, either
+version 1.3c of this license or (at your option) any later
+version. This version of this license is in
+ http://www.latex-project.org/lppl/lppl-1-3c.txt
+and 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 2005/12/01 or later.
+
+This work has the LPPL maintenance status `maintained'.
+
+The Current Maintainer of this work is
+ Gau, Syu ( GauSyu@Gmail.com ).
+
+----------------------------------------------------------------------
+
+\endpreamble
+
+\keepsilent
+
+\generate{
+ \usedir{tex/latex/secnum}
+ \file{\jobname.sty}{\from{\jobname.dtx}{package}}
+ \nopreamble\nopostamble
+ \file{README.md}{\from{\jobname.dtx}{readme}}
+}
+\Msg{*************************************************************}
+\Msg{* *}
+\Msg{* To finish the installation you have to move the following *}
+\Msg{* file into proper directories searched by TeX: *}
+\Msg{* *}
+\Msg{* The recommended directory is TDS:tex/latex/secnum *}
+\Msg{* *}
+\Msg{* secnum.sty *}
+\Msg{* *}
+\Msg{* To produce the documentation run the file secnum.dtx *}
+\Msg{* through XeLaTeX. *}
+\Msg{* *}
+\Msg{* Happy TeXing! *}
+\Msg{* *}
+\Msg{*************************************************************}
+\endbatchfile
+%</install>
+%<*internal>
+\fi
+%</internal>
+%<*driver>
+\ProvidesFile{secnum.dtx}
+\documentclass{l3doc}
+\usepackage{indentfirst}
+\usepackage{booktabs}
+\usepackage{xcolor}
+\usepackage{secnum}
+\setsecnum{A}
+\ExplSyntaxOn
+\cs_set_eq:NN \__codedoc_macro_end_style:n \use_none:n
+\ExplSyntaxOff
+\DeclareRobustCommand \opt {\texttt}
+\EnableCrossrefs
+\CodelineIndex
+\RecordChanges
+\begin{document}
+ \DocInput{\jobname.dtx}
+\end{document}
+%</driver>
+% \fi
+% \GetFileInfo{\jobname.sty}
+% \DoNotIndex{\cs}
+%
+% \title{ The \pkg{\jobname} package }
+% \author{ Gau, Syu }
+% \date{ \textit{Last Update:} \filedate }
+%
+% \maketitle
+%
+% \begin{abstract}
+% The package \pkg{\jobname} provides a marco \cs{setsecnum}
+% which allows user to format section numbering intuitively.
+% \end{abstract}
+%
+% \tableofcontents
+% \begin{documentation}
+% \section{Usage}
+% Before using the macro, load the package in preamble.
+% \begin{verbatim}
+% \usepackage{secnum}
+% \end{verbatim}
+% Then, one can format the section numbering by using the
+% marco \cs{setsecnum} in preamble.
+% \begin{function}{\setsecnum}
+% \begin{syntax}
+% \cs{setsecnum} \meta{num format}
+% \end{syntax}
+% A typical \meta{num format} is like this:
+% \begin{center}
+% \verb|1.1.1|
+% \end{center}
+% It consists of some syntax abbrs of numbering formats,
+% reffering the follows,
+% \begin{center}
+% \begin{tabular}{ccccc}
+% \toprule
+% A & a & I & i & 1 \\
+% \midrule
+% \cs{Alph} & \cs{alph} & \cs{Roman} & \cs{roman} & \cs{arabic} \\
+% \bottomrule
+% \end{tabular}
+% \end{center}
+% and some separators, which can be any character except
+% the abbrs and special characters such as barces ``\verb|{}|'',
+% comma ``\verb|,|'', space ``\verb*| |'', etc.
+% \end{function}
+%
+% \section{Process}
+% The process of the macro \cs{setsecnum} can be
+% explained as follows.
+% \begin{enumerate}[label=Step \arabic*.]
+% \item The main function eats the input, saying \opt{I.1.a},
+% and stores it in a token list.
+% \item Replace abbrs by macros.
+% In our example, it results
+% ``\cs{Roman}\opt{.}\cs{arabic}\opt{.}\cs{alph}''
+% \item Split this token list into a sequence by macros.
+% In our example, it results ``\cs{Roman}'',
+% ``\opt{.}\cs{arabic}'' and ``\opt{.}\cs{alph}''.
+% \item Store those codes in indivial containers.
+% \item Use them to renew \cs{thesection}, \cs{thesubsection},
+% \cs{thesubsubsection} etc.
+% provided there is no \cs{chapter}.
+% \end{enumerate}
+%
+% \end{documentation}
+%
+% \StopEventually{}
+%
+% \begin{implementation}
+% \section{Implementation}
+% The following is the implementation.
+% Users can ignore.
+% \subsection{Preparations}
+% This document class uses \LaTeX3.
+% Therefore, the packages \pkg{expl3}, \pkg{xparse}
+% and \pkg{l3keys2e} are needed and should use
+% \cs{ProvidesExplClass} rather than \cs{ProvidesClass}.
+%
+% \begin{macrocode}
+%<*package>
+%<@@=syu>
+\NeedsTeXFormat{LaTeX2e}
+\RequirePackage{expl3}
+\ProvidesExplPackage{secnum}{2020/01/01}{}
+ { An intuitive way to format section numbering }
+\RequirePackage{xparse}
+% \end{macrocode}
+%
+% \begin{variable}{ \l__syu_secnum_tl, \l__syu_secnum_seq }
+% The two variables are used to store the formatting information.
+% \begin{macrocode}
+\tl_new:N \l__syu_secnum_tl
+\seq_new:N \l__syu_secnum_seq
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{
+% \g__syu_chapter_tl,
+% \g__syu_section_tl,
+% \g__syu_subsection_tl,
+% \g__syu_subsubsection_tl,
+% \g__syu_paragraph_tl,
+% \g__syu_subparagraph_tl
+% }
+% The following variables are used to store
+% the individal formatting codes.
+% \begin{macrocode}
+\tl_new:N \g__syu_chapter_tl
+\tl_new:N \g__syu_section_tl
+\tl_new:N \g__syu_subsection_tl
+\tl_new:N \g__syu_subsubsection_tl
+\tl_new:N \g__syu_paragraph_tl
+\tl_new:N \g__syu_subparagraph_tl
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{ \g__syu_if_thechapter_int }
+% This \meta{integer} encodes if \cs{thechapter} is defined.
+% \begin{macrocode}
+\int_new:N \g__syu_if_thechapter_int
+% \end{macrocode}
+% If \cs{thechapter} is defined, it is $1$.
+% \begin{macrocode}
+\if_cs_exist:N \thechapter
+ \int_gset:Nn \g__syu_if_thechapter_int 1
+% \end{macrocode}
+% Otherwise, it is $0$.
+% \begin{macrocode}
+\else:
+ \int_gset:Nn \g__syu_if_thechapter_int 0
+\fi:
+% \end{macrocode}
+% \end{variable}
+%
+% \subsection{Main function}
+%
+% \begin{macro}{\setsecnum}
+% Here is the definition of the main function \cs{setsecnum}.
+% \begin{macrocode}
+\DeclareDocumentCommand{\setsecnum}{m}
+ {
+% \end{macrocode}
+% Store the input in.
+% \begin{macrocode}
+ \tl_set:Nn \l__syu_secnum_tl {#1}
+% \end{macrocode}
+% Replace syntax abbrs by corresponding macros.
+% \begin{macrocode}
+ \syu_secnum_unabbr:N \l__syu_secnum_tl
+% \end{macrocode}
+% Split into a sequence by macros.
+% \begin{macrocode}
+ \syu_split_by_macros:NN \l__syu_secnum_tl \l__syu_secnum_seq
+% \end{macrocode}
+% Read formatting information.
+% \begin{macrocode}
+ \syu_secnum_from_seq:N \l__syu_secnum_seq
+% \end{macrocode}
+% Set the \opt{secnumdepth}.
+% \begin{macrocode}
+ \setcounter{secnumdepth}{ \seq_count:N \l__syu_secnum_seq }
+% \end{macrocode}
+% Format numberings.
+% \begin{macrocode}
+ \syu_secnum:
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Unabbravation}
+% \begin{variable}{ \syu_secnum_unabbr:N }
+% This function replace the abbrs in a \meta{tl var}
+% by expansions.
+% \begin{macrocode}
+\cs_new_protected:Npn \syu_secnum_unabbr:N #1
+ {
+ \regex_replace_all:nnN {A} {\c{Alph}} #1
+ \regex_replace_all:nnN {a} {\c{alph}} #1
+ \regex_replace_all:nnN {I} {\c{Roman}} #1
+ \regex_replace_all:nnN {i} {\c{roman}} #1
+ \regex_replace_all:nnN {1} {\c{arabic}} #1
+ }
+% \end{macrocode}
+% \end{variable}
+%
+% \subsection{Split to sequence}
+% \begin{variable}{ \syu_split_by_macros:NN }
+% This function split a \meta{tl var} into a \meta{sequence}
+% by macros.
+% \begin{macrocode}
+\cs_new_protected:Npn \syu_split_by_macros:NN #1 #2
+ {
+ \tl_clear:N \l_tmpa_tl
+ \seq_clear:N #2
+ \tl_map_inline:Nn #1
+ {
+ \tl_put_right:Nn \l_tmpa_tl ##1
+ \__syu_if_macro:nT ##1
+ {
+ \seq_put_right:NV #2 \l_tmpa_tl
+ \tl_clear:N \l_tmpa_tl
+ }
+ }
+ }
+% \end{macrocode}
+% \end{variable}
+% But how to see if an \meta{item} in the token list is a macro?
+% \begin{variable}{ \g__syu_macro_tl }
+% This \meta{tl var} stores the first five characters
+% of the meaning of any macro,
+% i.e. \opt{macro} (watch out its catcode).
+% The idea is to creat a \meta{tl var} and then set
+% its value to be the first five characters of its meaning.
+% \begin{macrocode}
+\tl_new:N \g__syu_macro_tl
+\tl_set:Nx \g__syu_macro_tl { \meaning \g__syu_macro_tl }
+\tl_gset:Nx \g__syu_macro_tl { \tl_range:Nnn \g__syu_macro_tl {1}{5} }
+% \end{macrocode}
+% \end{variable}
+% \begin{variable}{ \__syu_if_macro:nT,
+% \__syu_if_macro:nF, \__syu_if_macro:nTF, }
+% Then, define a conditional testing if the input is a macro.
+% Note that I use \cs{if_meaning} rather than \cs{tl_if_eq:NNTF}.
+% \begin{macrocode}
+\prg_new_protected_conditional:Npnn \__syu_if_macro:n #1 { T , F , TF }
+ {
+ \group_begin:
+ \tl_set:Nx \l_tmpa_tl {\meaning #1}
+ \tl_set:Nx \l_tmpa_tl {\tl_range:Nnn \l_tmpa_tl {1} {5}}
+% \end{macrocode}
+% This is a trick to keep \cs{l_tmpa_tl} in the current local group
+% \begin{macrocode}
+ \exp_after:wN
+ \group_end:
+% \end{macrocode}
+% while throwing the comparison result out.
+% \begin{macrocode}
+ \if_meaning:w \l_tmpa_tl \g__syu_macro_tl
+ \prg_return_true:
+ \else:
+ \prg_return_false:
+ \fi:
+ }
+% \end{macrocode}
+% \end{variable}
+%
+% \subsection{Read formatting info}
+% \begin{variable}{ \syu_secnum_from_seq:N }
+% Read the formatting info from given \meta{sequence}.
+% \begin{macrocode}
+\cs_new_protected:Npn \syu_secnum_from_seq:N #1
+ {
+% \end{macrocode}
+% Use \cs{tl_gset:Nx} since: 1, these data are global and
+% 2: I need them eating the fully expanded results.
+% \begin{macrocode}
+ \tl_gset:Nx \g__syu_chapter_tl
+ { \seq_item:Nn #1 { \g__syu_if_thechapter_int } }
+ \tl_gset:Nx \g__syu_section_tl
+ { \seq_item:Nn #1 { 1 + \g__syu_if_thechapter_int } }
+ \tl_gset:Nx \g__syu_subsection_tl
+ { \seq_item:Nn #1 { 2 + \g__syu_if_thechapter_int } }
+ \tl_gset:Nx \g__syu_subsubsection_tl
+ { \seq_item:Nn #1 { 3 + \g__syu_if_thechapter_int } }
+ \tl_gset:Nx \g__syu_paragraph_tl
+ { \seq_item:Nn #1 { 4 + \g__syu_if_thechapter_int } }
+ \tl_gset:Nx \g__syu_subparagraph_tl
+ { \seq_item:Nn #1 { 5 + \g__syu_if_thechapter_int } }
+ }
+% \end{macrocode}
+% \end{variable}
+%
+% \subsection{Formatting}
+% \begin{variable}{ \syu_secnum: }
+% Formatting section numbering.
+% \begin{macrocode}
+\cs_new:Nn \syu_secnum:
+ {
+% \end{macrocode}
+% When \cs{thechapter} is defined, start from it.
+% \begin{macrocode}
+ \if_cs_exist:N \thechapter
+ \renewcommand*{\thechapter}
+ { \g__syu_chapter_tl {chapter} }
+ \renewcommand*{\thesection}
+ { \thechapter
+ \g__syu_section_tl {section} }
+% \end{macrocode}
+% Otherwise start from \cs{thesection}.
+% \begin{macrocode}
+ \else:
+ \renewcommand*{\thesection}
+ { \g__syu_section_tl {section} }
+ \fi:
+% \end{macrocode}
+% The rest levels.
+% \begin{macrocode}
+ \renewcommand*{\thesubsection}
+ { \thesection
+ \g__syu_subsection_tl {subsection} }
+ \renewcommand*{\thesubsubsection}
+ { \thesubsection
+ \g__syu_subsubsection_tl {subsubsection} }
+ \renewcommand*{\theparagraph}
+ { \thesubsubsection
+ \g__syu_paragraph_tl {paragraph} }
+ \renewcommand*{\thesubparagraph}
+ { \theparagraph
+ \g__syu_subparagraph_tl {subparagraph} }
+ }
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+%\end{implementation}
+%
+%
+% \changes{}{2020/01/01}{Correct the package name.}
+%
+% \Finale
+\endinput \ No newline at end of file