summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/crumbs/crumbs.sty
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/crumbs/crumbs.sty')
-rw-r--r--macros/latex/contrib/crumbs/crumbs.sty92
1 files changed, 92 insertions, 0 deletions
diff --git a/macros/latex/contrib/crumbs/crumbs.sty b/macros/latex/contrib/crumbs/crumbs.sty
new file mode 100644
index 0000000000..9c29b5dc78
--- /dev/null
+++ b/macros/latex/contrib/crumbs/crumbs.sty
@@ -0,0 +1,92 @@
+% (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/04 0.1.0 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
+}
+
+\newcommand\crumb[2]{#1}
+\newcommand\subcrumb[2]{#1}
+\newcommand*\crumbs{}
+\newcounter{crumbi}
+\newcounter{subcrumbi}
+\AtBeginDocument{
+ \let\oldsection\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
+ \oldsection{#2}
+ }%
+ \let\oldsubsection\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
+ \oldsubsection{#2}
+ }%
+ \IfFileExists{\jobname.crumbs}{\input{\jobname.crumbs}}{}%
+}
+
+\endinput