Исправление макроса \l@part для просмотра оглавления

Исправление макроса \l@part для просмотра оглавления

Я пропатчил макрос класса стандартной книги \l@partдля желаемого вида. Я хочу добавить какое-нибудь слово в место (в коде ниже), если макрос \partснят со звездочки, и ничего не добавлять, если \part*. Можно ли обойтись без дополнительных пакетов? Может быть, используя \g@addto@macroв \@partили \@spart.

\renewcommand*\l@part[2]{%
    \ifnum \c@tocdepth >-2\relax
        \addpenalty{-\@highpenalty}%
        \addvspace{1em \@plus\p@}%
        \setlength\@tempdima{3em}%
        \begingroup
        \parindent \z@ \rightskip \@pnumwidth
        \parfillskip -\@pnumwidth
        {\leavevmode
            {IF \part IS UNSTARED ADD SOME WORD HERE}\hrulefill\nopagebreak\par\medskip   
            \large \bfseries \vbox{\centering\sffamily\bfseries#1}%
            %\hfil \hb@xt@\@pnumwidth{\hss #2}
        }
        \nopagebreak\hrulefill\par
        \vspace*{1ex}
        \nobreak
        \global\@nobreaktrue
        \everypar{\global\@nobreakfalse\everypar{}}%
        \endgroup
    \fi
    }

Мой MWEниже

\documentclass[a4paper,12pt]{book}
\usepackage[utf8]{inputenc}
\usepackage{lipsum}
\makeatletter
\renewcommand*\l@part[2]{%
    \ifnum \c@tocdepth >-2\relax
    \addpenalty{-\@highpenalty}%
    \addvspace{1em \@plus\p@}%
    \setlength\@tempdima{3em}%
    \begingroup
    \parindent \z@ \rightskip \@pnumwidth
    \parfillskip -\@pnumwidth
    {\leavevmode
        \hrulefill\nopagebreak\par\medskip   
        \large \bfseries \vbox{\centering\sffamily\bfseries#1}%
        %\hfil \hb@xt@\@pnumwidth{\hss #2}
    }
    \nopagebreak\hrulefill\par
    \vspace*{1ex}
    \nobreak
    \global\@nobreaktrue
    \everypar{\global\@nobreakfalse\everypar{}}%
    \endgroup
    \fi
}

\def\partmark{}



\def\@part[#1]#2{%
    \renewcommand\partmark{#1}
    \thispagestyle{empty}
    \addcontentsline{toc}{part}{#1}%
    \markboth{}{}%
    {\centering
        \interlinepenalty \@M
        \vskip 20\p@
        \Huge\sffamily\bfseries #2\par
        \vskip 20\p@
        \hrulefill
    }%
    \@endpart
    }

\def\@spart#1{%
    \renewcommand\partmark{#1}
    \thispagestyle{empty}
\addcontentsline{toc}{part}{#1}%%
    {\centering
        \interlinepenalty \@M
        \normalfont
        \Huge \sffamily\bfseries #1\par}%
    \@endpart
}
\makeatother


\begin{document}
\tableofcontents

\part*{Stared}
\chapter{ABC}
\lipsum[1]

\part{UnStared}
\chapter{DEF}
\lipsum[1]

\end{document}

решение1

Самый простой способ — использовать conditional, скажем, \ifnotstarredversionкоторый устанавливается в значение , trueесли \partиспользуется, в противном случае — false.

Однако состояние условного оператора должно быть записано в ToCфайл с помощью \addtocontents{toc}{\protect\notstarredtrue}, поскольку оно должно быть оценено в момент ToCгенерации , а не в момент \partиспользования \addcontentslineetc.

Используйте макрос \partleadinword(или назовите его как угодно), чтобы сохранить содержимое слова(ов) и т. д., которое должно быть помещено в начало строки, если используется \part.

\documentclass[a4paper,12pt]{book}
\usepackage[utf8]{inputenc}
\usepackage{lipsum}


\makeatletter

\newif\ifnotstarredversion



\newcommand{\partleadinword}{Please provide a MWE ;-)}

\renewcommand*\l@part[2]{%
    \ifnum \c@tocdepth >-2\relax
    \addpenalty{-\@highpenalty}%
    \addvspace{1em \@plus\p@}%
    \setlength\@tempdima{3em}%
    \begingroup
    \parindent \z@ \rightskip \@pnumwidth
    \parfillskip -\@pnumwidth
    {\leavevmode
      \ifnotstarredversion
      \partleadinword%
      \fi
      \hrulefill\nopagebreak\par\medskip   
      \large \bfseries \vbox{\centering\sffamily\bfseries#1}%
      % \hfil \hb@xt@\@pnumwidth{\hss #2}

    }
    \nopagebreak\hrulefill\par
    \vspace*{1ex}
    \nobreak
    \global\@nobreaktrue
    \everypar{\global\@nobreakfalse\everypar{}}%
    \endgroup
    \fi
}

\def\partmark{}



\def\@part[#1]#2{%
  \renewcommand\partmark{#1}
  \thispagestyle{empty}
  \addtocontents{toc}{\protect\notstarredversiontrue}
  \addcontentsline{toc}{part}{#1}%
  \markboth{}{}%
  {\centering
    \interlinepenalty \@M
        \vskip 20\p@
        \Huge\sffamily\bfseries #2\par
        \vskip 20\p@
        \hrulefill
      }%
      \@endpart
    }

\def\@spart#1{%
    \renewcommand\partmark{#1}
    \thispagestyle{empty}
    \addtocontents{toc}{\protect\notstarredversionfalse}
    \addcontentsline{toc}{part}{#1}%%
    {\centering
        \interlinepenalty \@M
        \normalfont
        \Huge \sffamily\bfseries #1\par}%
    \@endpart
}
\makeatother


\begin{document}
\tableofcontents

\part*{Intro}
\chapter{ABC}
\lipsum[1]

\part{One}
\chapter{DEF}
\lipsum[1]

\end{document}

Связанный контент