
Der Versuch, ein Makro zu programmieren, das ähnlich ist wie \adcontentsline
: Anwenden \immediate\write
auf, sagen wir,
\frameEntry{\insertframenumber}{\inserframetitle \}{\thepage}
erfasst die falsche Seitenzahl. Wird umgekehrt die \write
auf den Zeitpunkt der Seitenausgabe verschoben, so wird die falsche \insertpagenumber
und die falsche \insertpagetitle
Seitenzahl erfasst.
Mehr Kontext: Ich arbeite daran, meinen eigenen kleinen Satz Makros für Inhaltsverzeichnisse zu schreiben, mit dem Ziel, eine Ausgabe von mehreren hundert Folien im article
-Modus zu erstellen. Die Herausforderung besteht darin, direkt nach jedem eine Liste von Rahmen im Stil eines Inhaltsverzeichnisses zu erstellen \subsection
.
Pakete wie minitoc
und titletoc
funktionierten nicht. Ersteres, da es sich weigert, ein Inhaltsverzeichnis zu erstellen und letzteres, weil es nicht gut mit funktioniert hyperref
.
Antwort1
Paketetocist mit der beamer
Klasse nicht kompatibel.
Wird es jedoch in einem Modus, also mit der Klasse und dem Paket beamer
verwendet , dann gilt:article
article
beamerarticle
etoc
\documentclass{article}
\usepackage{beamerarticle}
\usepackage{etoc}
% section=1, subsection=2, subsubsection=3
\etocsetlevel {beamerframe}{6}% dummy, a priori invisible, level
\etocsettocdepth {all}
% Earlier provisory code by jfbu
% \let\oldframetitle \frametitle
% \renewcommand\frametitle [1]{%
% \etoctoccontentsline{beamerframe}{#1}%
% \oldframetitle {#1}%
% }
%%%%
% Better code by Yossi Gil
% Override action when frame title is encountered:
\setbeamertemplate{frametitle}{%
\paragraph{\insertframenumber.~\insertframetitle}\\
\noindent\emph{\insertframesubtitle}\par
\etoctoccontentsline{beamerframe}{\insertframenumber.~\insertframetitle}%
}
%%%%
% Command to list frames in a sub-section:
\newcommand\listofframesinsubsection {\begingroup
% we are going to list one frame per line, with dots up to the page number,
% this is the default etoc design for subsections, we thus need to set the
% level of a beamerframe to 2. But then we need to artificially move up the
% leve of subsection so that \localtableofcontents does see the beamerframes
% as sub levels of a subsection
\etocsetlevel {subsection}{1}% artificially pretending subsections are
% sections one up the level
\etocsetlevel {beamerframe}{2}% pretending beamerframes are subsections
\etoctoclines % use the styles defined by \etocsetstyle, or here, as we
% didn't make any use of \etocsetstyle, just defaults
% to the package default styles (which are convenient for
% us here.)
\etocsettocstyle {\noindent Frames in this subsection:\par}{}%
\etocsetnexttocdepth {beamerframe}%
\localtableofcontents
\endgroup % clean up all our mess for the next \localtableofcontents not to
% be affected and proceed in compatibility mode with the same
% default design as in article class
}
\begin{document}
\etocsetnexttocdepth {subsection}
\tableofcontents
\section{Some frames}
%\etocsettocstyle{\subsection*{Local contents:}}{}
\etocsettocstyle {}{}
\etocsetnexttocdepth {subsection}
\localtableofcontents
\subsection {first subsection}
\listofframesinsubsection
\begin{frame}\frametitle{AHK}
Ah Ah
\end{frame}
\begin{frame}\frametitle{AHJ}
Oh Oh
\end{frame}
\subsection {second subsection}
\listofframesinsubsection
\begin{frame}\frametitle{HBZ}
Ah Ah
\end{frame}
\begin{frame}\frametitle{HBW}
Oh Oh
\end{frame}
\section{More frames}
%\etocsettocstyle{\subsection*{Local contents:}}{}
\etocsettocstyle {}{}
\etocsetnexttocdepth {subsection}
\localtableofcontents
\subsection {third subsection}
\listofframesinsubsection
\begin{frame}\frametitle{BHK}
Ah Ah
\end{frame}
\begin{frame}\frametitle{BHJ}
Oh Oh
\end{frame}
\subsection {fourth subsection}
\listofframesinsubsection
\begin{frame}\frametitle{BBZ}
Ah Ah
\end{frame}
\begin{frame}\frametitle{BBW}
Oh Oh
\end{frame}
\end{document}
(die Bilder wurden neu generiert, um die Einfügung der im aktualisierten Code hinzugefügten Frame-Nummer widerzuspiegeln)
Hinweis: Im obigen Code deklarieren die Frames einen Absatz. Wenn die einzigen Absätze in den Unterabschnitten auf diese Weise mit Frames verknüpft sind, kann die Präambel vereinfacht werden. Es ist nicht erforderlich, eine beamerframe
Abschnittsebene dafür zu definieren etoc
. Hier ist eine solche vereinfachte Präambel (wenn das Dokument bereits mit der früheren Präambel kompiliert wurde, sollten die Hilfsdateien gelöscht oder einfach zweimal kompiliert werden, wobei der Fehler bei der ersten Kompilierung ignoriert wird).
\documentclass{article}
\usepackage{beamerarticle}
\usepackage{etoc}
% section=1, subsection=2, subsubsection=3
\etocsettocdepth {all}
\setbeamertemplate{frametitle}{%
\paragraph{\insertframenumber.~\insertframetitle}\\
\noindent\emph{\insertframesubtitle}\par
}
% Command to list frames in a sub-section:
\newcommand\listofframesinsubsection {\begingroup
\etocsetlevel {subsection}{1}% pretending subsections are sections
\etocsetlevel {paragraph}{2}% pretending paragraphs are subsections
\etoctoclines % allows to use the package default styles for subsections
\etocsettocstyle {\noindent Frames in this subsection:\par}{}%
\etocsetnexttocdepth {paragraph}%
\localtableofcontents
\endgroup
}
[YG:]
Die obigen Befehle funktionieren nur in diesem Modus . Aus diesem Grund ist es wahrscheinlich am besten, das Obige in den meisten der obigen Präambeln article
zu schützen .\mode{
}
Eine weitere bewährte Methode besteht darin, zwei separate Dateien zu verwenden, für den Artikel- und den Folienmodus. Beide Dateien sollten \input
die Dateien sein, in denen sich die eigentlichen Frames befinden. Wenn Sie dies tun, ist ein solcher Schutz nicht erforderlich.