Parcheando la macro \l@part para la vista TOC

Parcheando la macro \l@part para la vista TOC

He parcheado la macro de clase de libro estándar \l@partpara una vista deseable. Deseo agregar alguna palabra al lugar (en el código a continuación) si la macro \partno está destacada, y no agregar nada, si \part*. ¿Es posible prescindir de paquetes adicionales? Puede estar usando \g@addto@macroen \@parto \@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
    }

mi MWEabajo

\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}

Respuesta1

La forma más sencilla es utilizar un conditional, por ejemplo, \ifnotstarredversionque está configurado como truesi \partse usa; de lo contrario, es false.

Sin embargo, el estado del condicional debe escribirse en el ToCarchivo con \addtocontents{toc}{\protect\notstarredtrue}, ya que debe evaluarse en el momento en que ToCse genera, no en el momento en que \partetc.\addcontentsline

Utilice la macro \partleadinword(o llámela como quiera) para contener el contenido de las palabras, etc., que deben colocarse al principio de la línea si se \partutiliza.

\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}

información relacionada