通过memoir
文档类,我既有简短内容(仅章节和节),也有详细内容(还有小节,恰好没有编号)。
是否可以在简短内容表中包含“详细内容”条目没有在详细目录中包括条目“目录”,反之亦然?
来源:
\documentclass[12pt]{memoir}
\begin{document}
\frontmatter
{\renewcommand*{\contentsname}{Short Contents}
\setcounter{tocdepth}{1}
\tableofcontents
}
\renewcommand*\contentsname{Detailed Contents}
\setcounter{tocdepth}{3}
\tableofcontents
\mainmatter
\chapter{First Chapter}
\section{Section 1}
\subsection*{First subsection}
\addcontentsline{toc}{subsection}{First subsection}
\subsection*{Second subsection}
\addcontentsline{toc}{subsection}{Second subsection}
\section{Section 2}
\end{document}
输出的第一页:
当然:
\tableofcontents*
仅对详细内容使用带星号的形式,会在两个 TOCS 中产生“简短内容”条目(但不会在任何内容中产生“详细内容”条目);仅对简短内容使用带星号的形式
\tableofcontents*
会在两个目录中产生“详细内容”条目(但都不会产生“简短内容”);并且对两者使用带星号的形式,将导致任一目录中均不会出现任何条目。
答案1
这是一个可能的解决方案,通过使用\if@shorttoc
开关并将虚拟内容写入 ToC,在加载文件\contentsline
时进行评估(通常隐藏).toc
\@input{\jobname.toc}
\@starttoc
如果\@shorttoctrue
设置了,\longcontentsstuff
将显示用于详细内容的内容行,相应地它是\relax
为\@shorttocfalse, accordingly the opposite is done for
\shortcontentsstuff` 设置的。
简化是通过\shorttableofcontents
和进行的\longtableofcontents
,两者都有一个可选参数,用作计数器的值。(我知道,也tocdepth
有与此 tocdepth 等效的函数)memoir
为了提供hyperref
支持,必须使用一些“重型”技巧。
memoir
也许我可以稍后寻找一个基于的解决方案。- 当然,我对的重新定义与的版本
\tableofcontents
并不兼容,尤其是方式。memoir
\tableofcontents*
\documentclass[12pt]{memoir}
\usepackage{hyperref}
\makeatletter
% Just in case we're not loading hyperref
\@ifpackageloaded{hyperref}{%
}{
\providecommand{\@currentHref}{}
\providecommand{\hyperlink}[2]{#2}
\providecommand{\getrefnumber}[1]{}
\providecommand{\phantomsection}{}
}
\AtBeginDocument{%
\newcommand{\shortcontentsstuff}{%
\contentsline{chapter}{\hyperlink{\getrefnumber{toc::shorttoc::anchor}}{\shortcontentsname}}{\pageref{toc::shorttoc}}{\getrefnumber{toc::shorttoc::anchor}}
}
\newcommand{\longcontentsstuff}{%
\contentsline{chapter}{\hyperlink{\getrefnumber{toc::longtoc::anchor}}{\longcontentsname}}{\pageref{toc::longtoc}}{\getrefnumber{toc::longtoc::anchor}}
}
}
\newif\if@shorttoc
\renewcommand{\tableofcontents}{%
\if@twocolumn
\@restonecoltrue\onecolumn
\else
\@restonecolfalse
\fi
\chapter*{\contentsname
\@mkboth{%
\MakeUppercase\contentsname}{\MakeUppercase\contentsname}}
% Addition
\if@shorttoc
\protected@edef\@currentlabel{shorttoc}% Rather unimportant
\edef\@currentlabelname{\shortcontentsname}% For \nameref
\label{toc::shorttoc}%
% Now let us fix the hyperanchor for the short toc
\edef\@currentlabelname{}%
\protected@edef\@currentlabel{\@currentHref}\label{toc::shorttoc::anchor}
\else
\protected@edef\@currentlabel{longtoc}% Rather unimportant
\edef\@currentlabelname{\longcontentsname}
\label{toc::longtoc}%
% Now let us fix the hyperanchor for the long toc
\edef\@currentlabelname{}%
\protected@edef\@currentlabel{\@currentHref}\label{toc::longtoc::anchor}
\fi
% End of additions
\@starttoc{toc}%
\if@restonecol\twocolumn\fi
}
\newcommand{\longcontentsname}{Detailed Contents}
\newcommand{\shortcontentsname}{Short Contents}
\newcommand{\shorttableofcontents}[1][1]{%
\begingroup
\@shorttoctrue
\setcounter{tocdepth}{#1}
\let\shortcontentsstuff\relax
\phantomsection
\write\@auxout{\string\@writefile{toc}{\protect\longcontentsstuff}}
\let\contentsname\shortcontentsname% Disabling the \shortcontentsstuff in toc
\tableofcontents
\endgroup
\@shorttocfalse% Disable the short toc
}
\newcommand{\longtableofcontents}[1][3]{%
\begingroup
\setcounter{tocdepth}{#1}
\phantomsection
\let\longcontentsstuff\relax% Disabling the \longcontentsstuff in toc
\write\@auxout{\string\@writefile{toc}{\protect\shortcontentsstuff}}
\let\contentsname\longcontentsname
\tableofcontents
\endgroup
}
\makeatother
\begin{document}
\frontmatter
\shorttableofcontents
\longtableofcontents
\mainmatter
\chapter{First Chapter}
\section{Section 1}
\subsection*{First subsection}
\addcontentsline{toc}{subsection}{First subsection}
\subsection*{Second subsection}
\addcontentsline{toc}{subsection}{Second subsection}
\section{Section 2}
\end{document}
这里未显示超链接...