% (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