Sie sind hier

[tocbasic] TOCEntryStyleStartInitCode nur im toplevel erfolgreich

Hallo,

Ich arbeite zur Zeit an einer Wrapper-Klasse, die – abhängig von einigen externen Faktoren – einige besondere Elemente im Inhaltsverzeichnis benötigt (Z.b. Titel von Tagungsbandbeiträgen). Diese externen Faktoren werden über ifthen-Abfragen geprüft und abhängig davon sollen bestimmte Einträge im Inhaltsverzeichnis via \DeclareTOCStyleEntry sichtbar gemacht und mit \TOCEntryStyleStartInitCode angepasst werden.

Dies gelingt auch, wenn die Anpassung im Toplevel (außerhalb jeder expansion) erfolgt. Wird \TOCEntryStyleStartInitCode jedoch in einem Argument gerufen (Z.b. im Wahr-Zweig von \ifthenelse{..}{ }{}, aber auch anderen), gibt es einen Fehler.

MWE:

\errorcontextlines=999
\documentclass{scrartcl}
\usepackage{tocbasic}
\tocbasicautomode
\def\this#1{#1}
\this{
  \CloneTOCEntryStyle{tocline}{title}
  \TOCEntryStyleStartInitCode{title}{%
    \expandafter\providecommand%
    \csname scr@tso@#1@linefill\endcsname {\hfill}%
  }
  \DeclareTOCStyleEntry[level=0,indent=0pt,numwidth=1.5em]{title}{title}
}
\begin{document}
\tableofcontents
\addcontentsline{toc}{title}{MyTitle}
\end{document}

Fehler bei \errorcontextlines=999:

Illegal parameter number in definition of \l@preto@macro@a@add.
 
                   1
 ... \providecommand \csname scr@tso@##1
                                                  @linefill\endcsname {\hfill }

\l@preto@macro@a@ ...ef \l@preto@macro@a@add {^^A1
                                                  }\l@preto@macro@a@@ 
 ...so@##1@linefill\endcsname {\hfill }}
                                                   \DeclareTOCStyleEntry [le...

\this #1->#1
            
l.13 }

Gibt es eine Möglichkeit, \TOCEntryStyleStartInitCode im nicht-Toplevel auszuführen?

Bild von Markus Kohm

Die Problematik ist vergleichbar der von xpatch:

\documentclass{article}
\usepackage{xpatch}
\def\test#1{#1}
\def\PatchTitle{%
  \xpretocmd{\test}{\typeout{TRACE: #1}}{}{\PatchFailure}%
}
\PatchTitle
\begin{document}
\test{OK}
\end{document}

Davon abgesehen ist \ifthenelse bezüglich Expansionen ohnehin problematisch. Verwende besser normale, mit \newif definierte Schalter oder Zähler zur Auswahl von Entscheidungen mit mehr als zwei Möglichkeiten.

Schade.

Da ich hier mit vielen Schaltern arbeiten muss, die untereinander verknüpft sind, ist ifthen schon sehr hilfreich.
Ich werde mir mit einer Krücke außerhalb von \ifthenelse behelfen.

Danke für die Hilfe.

Comments for "[tocbasic]  TOCEntryStyleStartInitCode nur im toplevel erfolgreich" abonnieren