summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/crumbs/crumbs.sty
blob: 2b497078da604dd30d8eb3847a4e19ec0b01f271 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
% (The MIT License)
%
% Copyright (c) 2021 Yegor Bugayenko
%
% Permission is hereby granted, free of charge, to any person obtaining a copy
% of this software and associated documentation files (the 'Software'), to deal
% in the Software without restriction, including without limitation the rights
% to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
% copies of the Software, and to permit persons to whom the Software is
% furnished to do so, subject to the following conditions:
%
% The above copyright notice and this permission notice shall be included in all
% copies or substantial portions of the Software.
%
% THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
% IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
% FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
% AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
% LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
% OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
% SOFTWARE.

\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{crumbs}[2021/09/09 0.2.2 Navigation Crumbs]

\RequirePackage{etoolbox}

% see https://tex.stackexchange.com/a/12414/1449
\makeatletter\newcommand\back{\@backslashchar}\makeatother
\makeatletter\newcommand\percent{\@percentchar}\makeatother
\RequirePackage{catchfile}
  \newwrite\appendwrite
  \newcommand*\appendtofile[2]{%
    \begingroup
    \IfFileExists{#1}%
      {\CatchFileDef{\filecontent}{#1}{\endlinechar=`^^J\catcode\endlinechar=12\relax}}% keep existing end-of-lines
      {\let\filecontent\empty}%
    \immediate\openout\appendwrite=#1\relax
    \immediate\write\appendwrite{\unexpanded\expandafter{\filecontent} #2}%
    \immediate\closeout\appendwrite
    \endgroup
  }

\newcommand\subcrumbs{
  \ifnum\value{section}=0\else
    \expandafter\ifcsname crumbs\romannumeral\the\value{section}\endcsname
      \csname crumbs\romannumeral\the\value{section}\endcsname{}
    \fi
  \fi
}

\NewCommandCopy\crumbsoldsection\section
\renewcommand\section[2][]{
  \def\temp{#1}
  \ifx\crumbs\empty
    \appendtofile{\jobname.crumbs}{
      \back ifx \back crumbs \back empty
        \back gappto \back crumbs{\back setcounter{crumbi}{0}}
      \back fi
      \back gappto\back crumbs{\back stepcounter{crumbi}\back crumb{\ifx\temp\empty #2\else #1\fi}{#2}}
    }
  \fi
  \crumbsoldsection{#2}
}

\NewCommandCopy\crumbsoldsubsection\subsection
\renewcommand\subsection[2][]{
  \def\temp{#1}
  \ifx\crumbs\empty
    \appendtofile{\jobname.crumbs}{
      \back ifcsname crumbs\romannumeral\the\value{section}\back endcsname\back else
        \back expandafter\back newcommand\back csname crumbs\romannumeral\the\value{section}\back endcsname{%
          \back setcounter{subcrumbi}{0}
        }
      \back fi
      \back expandafter\back gappto\back csname crumbs\romannumeral\the\value{section}\back endcsname{%
        \back stepcounter{subcrumbi}
        \back subcrumb{\ifx\temp\empty #2\else #1\fi}{#2}
      }
    }
  \fi
  \crumbsoldsubsection{#2}
}

\ifcsname crumb\endcsname
  \message{The command "crumb" already defined}
\else
  \newcommand\crumb[2]{#1}
\fi
\ifcsname subcrumb\endcsname
  \message{The command "crumb" already defined}
\else
  \newcommand\subcrumb[2]{#1}
\fi

\newcommand*\crumbs{}
\newcounter{crumbi}
\newcounter{subcrumbi}
\AtBeginDocument{\IfFileExists{\jobname.crumbs}{\input{\jobname.crumbs}}{}}

\endinput