作为我的后续上一个问题关于为每个小节生成目录的主题,我想提出以下挑战。
生成本地和全局目录,这样显示文档组织单元的行:节、小节、小小节将显示其中的总段落数。
谢谢并请求修正错误
非常感谢吉富布感谢他详细而机智的回答。他回答中那个神秘的名字挑战花费了我好几个小时,但我设法将框架降级为子段落(这样做是有充分理由的,因为文档可能包含不是框架的段落)。然而,我无法生成我想要的完整目录。
我将其使用过程中的问题缩小到部分目录为空的情况。
这是以 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}