作為我的後續上一個問題關於為每個小節產生目錄的主題,我想提出以下挑戰。
產生本機和全域目錄,以便顯示文件組織單位的行:節、小節、小節將顯示其中的段落總數。
感謝並請求更正錯誤
非常感謝吉林大學感謝他詳細而聰明的回答。他的回答中的神秘名稱挑戰花了我很多時間,但我設法將框架降級為分段(這樣做有一個很好的理由,因為文件可能包含不是框架的段落)。然而,我無法產生我想要的完整目錄。
我將使用它的問題範圍縮小到某些目錄為空的情況。
這是一個模仿 jfbu 的 MWE吉林大學工作。
\documentclass{article}
\usepackage{beamerarticle}
\usepackage{etoc}
\usepackage{etoc}
% Override action when frame title is encountered:
\setbeamertemplate{frametitle}{\relax
% Similar to \hrule but above the base line
\def\Hrulefill{\leavevmode\leaders\hrule height 0.8ex depth -0.6ex\hfill\kern0pt}
\def\frameTitle{\relax
\itshape
\small
\bfseries
\protect\(\cdot\protect\)\insertframenumber.~\insertframetitle
\space
\footnotesize \mdseries
\insertframesubtitle
}%
\typeout{after defs}\relax
\Hrulefill
\typeout{after hrule}\relax
\fbox{\begin{minipage}{0.7\linewidth}\frameTitle\end{minipage}}%\relax
\typeout{after title}\relax
\addcontentsline{toc}{subparagraph}{\frameTitle}\relax
\Hrulefill
\typeout{after hrulefill}\relax
\par\noindent
\typeout{after par no indent}\relax
}
\newcounter{parinsection}
\newcounter{parinsubsection}
\newcounter{parinsubsubsection}
\makeatletter % cf etoc manual "another compatibility mode"
\let\orig@lsection\l@section
\let\orig@lsubsection\l@subsection
\let\orig@lsubsubsection\l@subsubsection
%
\etocsetstyle{section}
{}
{\typeout{prefix in section}}
{\typeout{item is section}\orig@lsection {\numberline{\etocnumber}\etocname{}
(\Yossi frames)}{\etocpage}}
{}
\etocsetstyle{subsection}
{\typeout{begin of SUBSECTION}}
{\typeout{prefix in subsection}}
{\typeout{item in susection}\orig@lsubsection {\numberline{\etocnumber}\etocname{}
\typeout{before frames count}(\Yossi frames)}{\etocpage}}
{\typeout{end of SUBSECTION}}
\etocsetstyle{subsubsection}
{\typeout{Begin SUBSUBSECTION}}
{\typeout{prefix sub sub section}}
{\relax
\typeout{item in sub sub section}\relax
\orig@lsubsubsection
{\etocname{} (\Yossi frames)}{\etocpage}
}
{\typeout{End SUBSUBSECTION}}
\etocsetstyle {subparagraph}
{\typeout{BEGIN SUBPARAGRAPH}}
{}
{\stepcounter{parinsection}%
\stepcounter{parinsubsection}%
\stepcounter{parinsubsubsection}}
{\typeout{END SUBPARAGRAPH}\xdef\yossic{\yossic{\arabic{parinsubsubsection}}}}
\newcommand\yossia {}
\newcommand\yossib {}
\newcommand\yossic {}
\newcommand\Yossi {\expandafter\Yossi@ \yossia\@nil}
\def\Yossi@ #1#2\@nil {\gdef\yossia{#2}#1 }
\makeatother
\newcommand{\CountFramesFor}[1]{%
\begingroup % first pass
\etocsetstyle {section}
{}
{}%
{\setcounter{parinsection}{0}}
{}%
\etocsetstyle {subsection}
{\xdef\yossib{}}
{}
{\setcounter{parinsubsection}{0}}
{\xdef\yossia{\yossia{\arabic{parinsection}}\yossib}}%
\etocsetstyle {subsubsection}
{\xdef\yossic{}}
{}
{\setcounter{parinsubsubsection}{0}}
{\xdef\yossib{\yossib{\arabic{parinsubsection}}\yossic}}%
\gdef\yossia{}\gdef\yossib{}\gdef\yossic{}%
\etocsettocstyle {}{}%
\etocsetnexttocdepth {subparagraph}%
#1%
\endgroup
}%
\newcommand{\GlobalTOC}{%
\typeout{before counting}\relax
\CountFramesFor\tableofcontents
\typeout{after counting}\relax
\etocsetnexttocdepth{subsubsection}%
\typeout{after set next toc depth}\relax
\tableofcontents
\typeout{after toc}\relax
}
\newcommand{\SectionTOC}{%
\CountFramesFor\localtableofcontents
\let\yossia\yossib
\begingroup
\etocsetstyle{subsubsection}{}{}{\setbox0\hbox{\Yossi}}{}%
\etocsetnexttocdepth{subsubsection}%
\etocsettocstyle {\noindent Contents:\par}{}%
\localtableofcontents
\endgroup
}
\newcommand{\SubSectionTOC}{%
\CountFramesFor\localtableofcontents
\let\yossia\yossic
\etocsetnexttocdepth{subsubsection}%
\etocsettocstyle {\noindent Contents:\par}{}%
\localtableofcontents
}
\newcommand{\listOfFramesInSubSubSection}{%
\begingroup
\etocsetlevel {subparagraph}{2}%
\etocsetlevel {subsubsection}{1}%
\etocsetlevel {subsection}{6}%
\etocsetlevel {section}{6}%
\etocsetlevel {paragraph}{6}%
\etocsettocstyle {\noindent\emph{Frames:}}{}%
\etocsetnexttocdepth {subparagraph}%
\etocdefaultlines
\etocsetstyle{subsection}
{\begingroup}
{\footnotesize}
{\etocname~\space}%
{\endgroup}
\localtableofcontents
\endgroup
}
\newcommand{\listOfFramesInSubSection}{%
\begingroup
\etocsetlevel {subparagraph}{3}%
\etocsetlevel {subsubsection}{2}%
\etocsetlevel {subsection}{1}%
\etocsetlevel {subsection}{6}%
\etocsetlevel {section}{6}%
\etocsetlevel {paragraph}{6}%
\etocsettocstyle {\noindent\emph{Frames:}\par}{}%
\etocsetnexttocdepth {subparagraph}%
\etocdefaultlines
\localtableofcontents
\endgroup
}
\begin{document}
\etocsettocdepth {subparagraph}
\GlobalTOC
\section{My First Section}\SectionTOC
\begin{frame}{My First Frame} has a bit of contents \end{frame}
\subsection{Subsection [A] in My First Section}
\SubSectionTOC
\listOfFramesInSubSection
\begin{frame}{My 2nd Frame} has another bit of contents \end{frame}
\subsection{Sububsection [I] in subsection [A] in My First Section}
\listOfFramesInSubSubSection
\begin{frame}{My THIRD Frame} has one bit and another bit of contents in it \end{frame}
\end{document}
答案1
更新
由於已經澄清了子小節可能沒有框架,小節可能沒有子小節,部分可能沒有小節,所以我提供了一個重新訪問的程式碼(見底部),它能夠處理這些事情。但請注意,我們不希望在沒有中間小節的情況下在節中出現小節。
這是改編版回答連結的問題,它添加了段落計數。這是按照法完成的埃托克,即使用不可見的目錄來完成這項工作。
根據評論進行更新,該評論更準確地描述了意圖。假設節和小節之間總是有小節,或是小節和段落之間總是有子小節。在這裡,框架環境創建段落,並且沒有其他段落。
最初的答案留在底部。更新的程式碼範例提供了四頁,此處僅顯示前兩頁。
\documentclass{article}
\usepackage{beamerarticle}
\usepackage{etoc}
% Override action when frame title is encountered: (Code by Yossi Gil)
\setbeamertemplate{frametitle}{%
\paragraph{\insertframenumber.~\insertframetitle}\\
\noindent\emph{\insertframesubtitle}\par
}
\newcounter{parinsection}
\newcounter{parinsubsection}
\newcounter{parinsubsubsection}
\makeatletter % cf etoc manual "another compatibility mode"
\let\orig@lsection\l@section
\let\orig@lsubsection\l@subsection
\let\orig@lsubsubsection\l@subsubsection
%
\etocsetstyle{section}
{}
{}
{\orig@lsection {\numberline{\etocnumber}\etocname{}
(\Yossi frames)}{\etocpage}}
{}
\etocsetstyle{subsection}
{}
{}
{\orig@lsubsection {\numberline{\etocnumber}\etocname{}
(\Yossi frames)}{\etocpage}}
{}
\etocsetstyle{subsubsection}
{}
{}
{\orig@lsubsubsection {\numberline{\etocnumber}\etocname{}
(\Yossi frames)}{\etocpage}}
{}
\etocsetstyle {paragraph}
{}
{}
{\stepcounter{parinsection}%
\stepcounter{parinsubsection}%
\stepcounter{parinsubsubsection}}
{\xdef\yossic{\yossic{\arabic{parinsubsubsection}}}}
\newcommand\yossia {}
\newcommand\yossib {}
\newcommand\yossic {}
\newcommand\Yossi {\expandafter\Yossi@ \yossia\@nil}
\def\Yossi@ #1#2\@nil {\gdef\yossia{#2}#1 }
\makeatother
\newcommand{\CountFramesFor}[1]{%
\begingroup % first pass
\etocsetstyle {section}
{}
{}%
{\setcounter{parinsection}{0}}
{}%
\etocsetstyle {subsection}
{\xdef\yossib{}}
{}
{\setcounter{parinsubsection}{0}}
{\xdef\yossia{\yossia{\arabic{parinsection}}\yossib}}%
\etocsetstyle {subsubsection}
{\xdef\yossic{}}
{}
{\setcounter{parinsubsubsection}{0}}
{\xdef\yossib{\yossib{\arabic{parinsubsection}}\yossic}}%
\gdef\yossia{}\gdef\yossib{}\gdef\yossic{}%
\etocsettocstyle {}{}%
\etocsetnexttocdepth {paragraph}%
#1%
\endgroup
}%
\newcommand{\GlobalToc}{%
\CountFramesFor\tableofcontents
% to suppress subsubsections:
%\begingroup
% \etocsetstyle{subsubsection}{}{}{\setbox0\hbox{\Yossi}}{}%
% to also suppress subsections
% \etocsetstyle{subsection}{}{}{\setbox0\hbox{\Yossi}}{}%
\etocsetnexttocdepth{subsubsection}%
\tableofcontents
%\endgroup
}
\newcommand{\SectionToc}{%
\CountFramesFor\localtableofcontents
\let\yossia\yossib
% to suppress subsubsections:
\begingroup
\etocsetstyle{subsubsection}{}{}{\setbox0\hbox{\Yossi}}{}%
\etocsetnexttocdepth{subsubsection}%
\etocsettocstyle {\noindent Contents:\par}{}%
\localtableofcontents
\endgroup
}
\newcommand{\SubsectionToc}{%
\CountFramesFor\localtableofcontents
\let\yossia\yossic
\etocsetnexttocdepth{subsubsection}%
\etocsettocstyle {\noindent Contents:\par}{}%
\localtableofcontents
}
\newcommand{\Listofframes}{%
\begingroup
\etocsetlevel {paragraph}{2}%
\etocsetlevel {subsubsection}{1}%
\etocsetlevel {subsection}{6}%
\etocsetlevel {section}{6}%
\etocsettocstyle {\noindent List of frames in this subsubsection\par}{}%
%\etocsetnexttocdepth {paragraph}%
\etocdefaultlines
\localtableofcontents
\endgroup
}
\begin{document}
\etocsettocdepth {paragraph}
\GlobalToc
\section{Some frames}
\SectionToc
\subsection {first subsection}
\SubsectionToc
\subsubsection{first subsubsection}
\Listofframes
\begin{frame}\frametitle{AHK}
Ah Ah
\end{frame}
\begin{frame}\frametitle{AHJ}
Oh Oh
\end{frame}
\begin{frame}\frametitle{AHM}
Ah Ah
\end{frame}
\subsubsection{second subsubsection}
\Listofframes
\begin{frame}\frametitle{AHN}
Oh Oh
\end{frame}
\subsection {second subsection}
\SubsectionToc
\subsubsection {subsubsection}
\Listofframes
\begin{frame}\frametitle{HBZ}
Ah Ah
\end{frame}
\subsubsection {subsubsection}
\Listofframes
\begin{frame}\frametitle{HBW}
Oh Oh
\end{frame}
\begin{frame}\frametitle{HBT}
Oh Oh
\end{frame}
\begin{frame}\frametitle{HBR}
Oh Oh
\end{frame}
\section{More frames}
\SectionToc
\subsection {third subsection}
\SubsectionToc
\subsubsection {subsubsection}
\Listofframes
\begin{frame}\frametitle{BHK}
Ah Ah
\end{frame}
\begin{frame}\frametitle{BHJ}
Oh Oh
\end{frame}
\begin{frame}\frametitle{BBZ}
Ah Ah
\end{frame}
\subsubsection {subsubsection}
\Listofframes
\begin{frame}\frametitle{BBW}
Oh Oh
\end{frame}
\begin{frame}\frametitle{BBU}
Oh Oh
\end{frame}
\subsection {fourth subsection}
\SubsectionToc
\subsubsection {subsubsection}
\Listofframes
\begin{frame}\frametitle{YHK}
Ah Ah
\end{frame}
\subsubsection {subsubsection}
\Listofframes
\begin{frame}\frametitle{YHJ}
Oh Oh
\end{frame}
\begin{frame}\frametitle{YYZ}
Ah Ah
\end{frame}
\begin{frame}\frametitle{YYW}
Oh Oh
\end{frame}
\end{document}
初步回答:
\documentclass{article}
\usepackage{beamerarticle}
\usepackage{etoc}
% section=1, subsection=2, subsubsection=3
\etocsettocdepth {all}
%Override action when frame title is encountered: (Code by Yossi Gil)
\setbeamertemplate{frametitle}{%
\paragraph{\insertframenumber.~\insertframetitle}\\
\noindent\emph{\insertframesubtitle}\par
}
\newcounter {mycountofframes}
\newcommand {\listofsubsectionswithframecount}{\begingroup
%%%%% count frames by executing an invisible table of contents
\setcounter {mycountofframes}{0}%
\etocsetnexttocdepth {paragraph}%
\etocsetstyle {subsection}{}{}{}{}%
\etocsetstyle {paragraph}{}{\stepcounter{mycountofframes}}{}{}%
\etocsettocstyle {}{}%
\localtableofcontents % invisible, just to count paragraphs (=frames)
%%%%%
%%%%% now list subsections
\etocsettocstyle
{\noindent Dear reader, there are in total \arabic{mycountofframes}
frames in this section.\par\medskip }
{}%
\etocsetnexttocdepth {subsection}%
\etocstandardlines % undoes the \etocsetstyle above,
% switches to class default for TOC lines
\localtableofcontents % Print the table of contents
\endgroup
}
\newcommand {\listofframesinthissubsection}{\begingroup
%%%%% count frames by executing an invisible table of contents
\setcounter {mycountofframes}{0}%
\etocsetnexttocdepth {paragraph}%
\etocsetstyle {paragraph}{}{\stepcounter{mycountofframes}}{}{}%
\etocnopar % says not to do \par, but doesn't matter here
\etocsettocstyle {}{}%
\localtableofcontents % just to count paragraphs (=frames)
%%%%%
%%%%% now list the paragraphs
\etocsetlevel {subsection}{1}% artificially pretending subsections are
% sections one up the level
\etocsetlevel {paragraph}{2}% pretending paragraphs are subsections
\etocdefaultlines % undoes the \etocsetstyle above, switches to package
% default for the TOC lines
\etocsettocstyle {\noindent The \arabic{mycountofframes}
frames in this subsection:\par\smallskip}{}%
\etocsetnexttocdepth {paragraph}%
\localtableofcontents
\endgroup % undo all our mess
}
\begin{document}
\etocsetnexttocdepth {subsection}
\tableofcontents
\section{Some frames}
\listofsubsectionswithframecount
\subsection {first subsection}
\listofframesinthissubsection
\begin{frame}\frametitle{AHK}
Ah Ah
\end{frame}
\begin{frame}\frametitle{AHJ}
Oh Oh
\end{frame}
\begin{frame}\frametitle{AHM}
Ah Ah
\end{frame}
\begin{frame}\frametitle{AHN}
Oh Oh
\end{frame}
\subsection {second subsection}
\listofframesinthissubsection
\begin{frame}\frametitle{HBZ}
Ah Ah
\end{frame}
\begin{frame}\frametitle{HBW}
Oh Oh
\end{frame}
\begin{frame}\frametitle{HBT}
Oh Oh
\end{frame}
\section{More frames}
\listofsubsectionswithframecount
\subsection {third subsection}
\listofframesinthissubsection
\begin{frame}\frametitle{BHK}
Ah Ah
\end{frame}
\begin{frame}\frametitle{BHJ}
Oh Oh
\end{frame}
\subsection {fourth subsection}
\listofframesinthissubsection
\begin{frame}\frametitle{BBZ}
Ah Ah
\end{frame}
\begin{frame}\frametitle{BBW}
Oh Oh
\end{frame}
\begin{frame}\frametitle{BBU}
Oh Oh
\end{frame}
\end{document}
更新了程式碼以處理丟失的幀
\documentclass{article}
\usepackage{beamerarticle}
\usepackage{etoc}
% % Override action when frame title is encountered: (Code by Yossi Gil)
\def\Hrulefill
{\leavevmode\leaders\hrule height 0.8ex depth -0.6ex\hfill\kern0pt }
\def\frameTitle{%
\itshape
\small
\bfseries
$\cdot$\insertframenumber.~\insertframetitle
\space
\footnotesize \mdseries
\insertframesubtitle
}%
\setbeamertemplate{frametitle}{\relax
% Similar to \hrule but above the base line
\noindent\Hrulefill
\addcontentsline{toc}{paragraph}{\frameTitle}%
\fbox{\begin{minipage}{0.7\linewidth}\frameTitle\end{minipage}}%
\Hrulefill\par
}
\newcounter{parinsection}
\newcounter{parinsubsection}
\newcounter{parinsubsubsection}
\makeatletter % cf etoc manual "another compatibility mode"
\let\orig@lsection\l@section
\let\orig@lsubsection\l@subsection
\let\orig@lsubsubsection\l@subsubsection
%
\etocsetstyle{section}
{}
{}
{\orig@lsection {\numberline{\etocnumber}\etocname{}
(\Yossi)}{\etocpage}}
{}
\etocsetstyle{subsection}
{}
{}
{\orig@lsubsection {\numberline{\etocnumber}\etocname{}
(\Yossi)}{\etocpage}}
{}
\etocsetstyle{subsubsection}
{}
{}
{\orig@lsubsubsection {\numberline{\etocnumber}\etocname{}
(\Yossi)}{\etocpage}}
{}
\etocsetstyle {paragraph}
{}
{}
{\stepcounter{parinsection}%
\stepcounter{parinsubsection}%
\stepcounter{parinsubsubsection}}
{}
\newcommand\yossia {}
\newcommand\yossib {}
\newcommand\yossic {}
\newcommand\Yossi {\expandafter\Yossi@ \yossia\@nil}
\def\Yossi@ #1#2\@nil {\gdef\yossia{#2}\begingroup\color{blue}%
\ifcase #1
no frame%
\or
1 frame%
\else #1 frames%
\fi\endgroup}%
\makeatother
\newcommand{\CountFramesFor}[1]{%
\begingroup % first pass
\etocsetstyle {section}
{\def\yossia{}\def\yossib{}%
\setcounter{parinsection}{0}%
\etocskipfirstprefix
}
{\edef\yossia{\yossia% earlier sec, sub and subsub
\arabic{parinsection}% add previous
% section
\yossib % and all sub and subsub therein
}%
}
{\setcounter{parinsection}{0}\def\yossib{}}
{\edef\yossia{\yossia% earlier sec, sub and subsub
\arabic{parinsection}% add last
% section
\yossib % and all sub and subsub therein
}%
}%
%
\etocsetstyle {subsection}
{\def\yossib{}\def\yossic{}%
\setcounter{parinsubsection}{0}%
\etocskipfirstprefix
}
{\edef\yossib{\yossib% previous sub and subsub
\arabic{parinsubsection}% add previous
% subsection
\yossic % and all subsub therein
}%
}
{\setcounter{parinsubsection}{0}\def\yossic{}}
{\edef\yossib{\yossib% previous sub and subsub
\arabic{parinsubsection}% add last
% subsection
\yossic % and all subsub therein
}%
}%
%
\etocsetstyle {subsubsection}
{\def\yossic{}%
\setcounter{parinsubsubsection}{0}%
\etocskipfirstprefix
}
{\edef\yossic{\yossic\arabic{parinsubsubsection}}}%
{\setcounter{parinsubsubsection}{0}}
{\edef\yossic{\yossic\arabic{parinsubsubsection}}}%
%
\etocsettocstyle {}{\global\let\yossia\yossia
\global\let\yossib\yossib
\global\let\yossic\yossic}%
\etocsetnexttocdepth {paragraph}%
#1%
\endgroup
}%
\newcommand{\GlobalToc}{%
\CountFramesFor\tableofcontents
% to suppress subsubsections:
%\begingroup
% \etocsetstyle{subsubsection}{}{}{\setbox0\hbox{\Yossi}}{}%
% to also suppress subsections
% \etocsetstyle{subsection}{}{}{\setbox0\hbox{\Yossi}}{}%
\etocsetnexttocdepth{subsubsection}%
\tableofcontents
%\endgroup
}
\newcommand{\SectionToc}{%
\CountFramesFor\localtableofcontents
\let\yossia\yossib
% this is to suppress listing subsubsections in the Section TOC:
\begingroup
\etocsetstyle{subsubsection}{}{}{\setbox0\hbox{\Yossi}}{}%
\etocsetnexttocdepth{subsubsection}%
\etocsettocstyle {\noindent Contents:\par}{}%
\localtableofcontents
\endgroup
}
\newcommand{\SubsectionToc}{%
\CountFramesFor\localtableofcontents
\let\yossia\yossic
\etocsetnexttocdepth{subsubsection}%
\etocsettocstyle {\noindent Contents:\par}{}%
\localtableofcontents
}
\newcommand{\Listofframes}{%
\begingroup
\etocsetlevel {paragraph}{2}%
\etocsetlevel {subsubsection}{1}%
\etocsetlevel {subsection}{6}%
\etocsetlevel {section}{6}%
\etocsettocstyle {\noindent List of frames in this subsubsection\par}{}%
\etocdefaultlines
\localtableofcontents
\endgroup
}
\begin{document}
\etocsettocdepth {paragraph}
\GlobalToc
\section{Section A}
\SectionToc
\subsection {subsection}
\SubsectionToc
\subsubsection{subsubsection}
% \Listofframes % don't use \listofframes in a subsubsection
No frames here.
\subsubsection{subsubsection}
\Listofframes
\begin{frame}\frametitle{AHN}
Oh Oh
\end{frame}
\begin{frame}\frametitle{BHN}
Oh Oh
\end{frame}
\subsection {subsection with no subsubsection}
There are no subsubsections here.
\section{Section B}
\SectionToc
\subsection {subsection}
\SubsectionToc
\subsubsection {subsubsection}
\Listofframes
\begin{frame}\frametitle{BHK}
Ah Ah
\end{frame}
\begin{frame}\frametitle{BHJ}
Oh Oh
\end{frame}
\begin{frame}\frametitle{BBZ}
Ah Ah
\end{frame}
\subsubsection {subsubsection}
\Listofframes
\begin{frame}\frametitle{BBW}
Oh Oh
\end{frame}
\begin{frame}\frametitle{BBU}
Oh Oh
\end{frame}
\subsubsection {subsubsection}
No frames here.
\subsection {subsection with no subsubsection}
Nothing here.
\subsection {subsection}
\SubsectionToc
\subsubsection {subsubsection}
\Listofframes
\begin{frame}\frametitle{YHK}
Ah Ah
\end{frame}
\subsubsection {subsubsection}
No frames here.
\subsubsection {subsubsection}
\Listofframes
\begin{frame}\frametitle{YHJ}
Oh Oh
\end{frame}
\begin{frame}\frametitle{YYZ}
Ah Ah
\end{frame}
\begin{frame}\frametitle{YYW}
Oh Oh
\end{frame}
\subsection {subsection}
\SubsectionToc
\subsubsection {subsubsection }
No frame.
\subsubsection {subsubsection }
No frame.
\end{document}