Lösen Sie das Geheimnis von \writecontentsline

Lösen Sie das Geheimnis von \writecontentsline

Der Versuch, ein Makro zu programmieren, das ähnlich ist wie \adcontentsline: Anwenden \immediate\writeauf, sagen wir,

\frameEntry{\insertframenumber}{\inserframetitle \}{\thepage} 

erfasst die falsche Seitenzahl. Wird umgekehrt die \writeauf den Zeitpunkt der Seitenausgabe verschoben, so wird die falsche \insertpagenumberund die falsche \insertpagetitleSeitenzahl 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 minitocund titletocfunktionierten nicht. Ersteres, da es sich weigert, ein Inhaltsverzeichnis zu erstellen und letzteres, weil es nicht gut mit funktioniert hyperref.

Antwort1

Paketetocist mit der beamerKlasse nicht kompatibel.

Wird es jedoch in einem Modus, also mit der Klasse und dem Paket beamerverwendet , dann gilt:articlearticlebeamerarticleetoc

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

etoc mit Beamerartikel Seite 1 etoc mit Beamerartikel Seite 2


[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 articlezu 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 \inputdie Dateien sein, in denen sich die eigentlichen Frames befinden. Wenn Sie dies tun, ist ein solcher Schutz nicht erforderlich.

verwandte Informationen