
Ich habe das Standardmakro der Buchklasse \l@part
für eine ansprechende Ansicht gepatcht. Ich möchte an der Stelle (im Code unten) ein Wort hinzufügen, wenn das Makro \part
nicht markiert ist, und nichts hinzufügen, wenn \part*
. Ist das ohne zusätzliche Pakete möglich? Möglicherweise verwenden Sie \g@addto@macro
in \@part
oder \@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
}
Mein MWE
unten
\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}
Antwort1
Am einfachsten geht das mit der Verwendung von conditional
, sagen wir , \ifnotstarredversion
das auf gesetzt ist, true
wenn \part
verwendet wird, andernfalls ist es false
.
Der Zustand der Bedingung muss jedoch ToC
mit in die Datei geschrieben werden \addtocontents{toc}{\protect\notstarredtrue}
, da er zum Zeitpunkt der ToC
Generierung ausgewertet werden muss und nicht zum Zeitpunkt, wenn \part
usw. verwendet \addcontentsline
.
Verwenden Sie das Makro \partleadinword
(oder nennen Sie es, wie Sie möchten), um den Inhalt für die Wörter usw. zu speichern, die am Anfang der Zeile platziert werden sollen, wenn es \part
verwendet wird.
\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}