私の前の質問各サブセクションの目次を生成するというテーマに関して、私は次のような課題を提起したいと思います。
ローカルおよびグローバルの目次を作成します。ドキュメントの組織単位 (セクション、サブセクション、サブサブセクション) を示す行に、その中の段落の合計数が表示されます。
感謝とバグ修正のリクエスト
感謝しますjfbu詳細かつ賢明な回答をありがとうございました。回答にある難解な名前のチャレンジに何時間も費やしましたが、フレームをサブパラグラフに格下げすることができました (文書にはフレームではないパラグラフが含まれている可能性があるため、そうすることには十分な理由があります)。ただし、希望どおりに完全な目次を作成することはできませんでした。
私は、これを使用する際の問題を、目次の一部が空の場合に限定しました。
これはjfbuをモデルにしたMWEですjfbu仕事。
\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
アップデート
サブサブセクションにはフレームがない場合があること、サブセクションにはサブサブセクションがない場合があること、セクションにはサブセクションがない場合があることが明確になったため、これらのことを処理できる再検討されたコード (下部を参照) を提供します。ただし、サブセクションを介さずにセクション内にサブサブセクションを配置することは望ましくないことに注意してください。
こちらはリンクされた質問への回答段落の数え方が追加されます。これは次のように行われます。エトックつまり、目に見えない目次を使用して作業を実行します。
コメントに従って更新します。コメントでは、意図した内容がより正確に説明されています。セクションとサブセクションの間には常にサブセクションがあり、サブセクションと段落の間には常にサブサブセクションがあると想定されています。ここでは、フレーム環境によって段落が作成され、他の段落はありません。
最初の回答は下部に残されています。更新のコード サンプルでは 4 ページが提供されますが、ここでは最初の 2 ページのみを示します。
\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}