目录重大修改

目录重大修改

我正在实现一个从未使用过 LaTeX 的人创建的设计:)

我已经使用一些 Tikz 图片魔法完成了大部分精美的设计,但现在我仅完成了最后百分之几,仍不明白如何实现目录设计。

以下是设计的内容(抱歉,从第 5 页开始我删掉了文字,但您应该明白我的意思): 所需目录

感谢这里所有出色的人以及我 20 年前的 LaTeX 书籍:

  • 创建了非标准 ttf 字体
  • 使用 chaprange 获取页面范围
  • 重新定义 \chapter 命令以从 \leftmark 中删除“章节”和编号,并防止其实际打印在页面上(这是设计)

我现在有了一个目录的开头,看起来像这样: 当前目录

与之相关的目录包含以下行:

\contentsline {chapter}{\numberline {}Introduction}{\pageref {chap:1}--\pageref {prenextchap:1}}

我需要取消标题的粗体并更改数字的字体大小,这两者都很简单。但是,我见过很多并排的目录样式,但在搜索中我没有看到章节标题位于页码(或在这种情况下为范围)下方的内容。此外,有没有办法将项目放在 anx 2 网格中?

部分文档由 Pweave 创建,我已经大量使用 Tikz 以及相当多其他软件包,并使用 xelatex 创建 pdf。我感觉可能有一个 tikz 解决方案,但对 toc 了解不够,无法开始。

由于整个内容首先是使用 python 和 pweave 生成​​的,所以这也是一种选择。

如果我在搜索过程中遗漏了什么,如果您能给我指出另一个答案或包裹,我会非常高兴!

答案1

这是一个开始。

我严格遵守以下约束:两行必须使用。

\documentclass{book}

\usepackage{etoc}
\etocsettocdepth{chapter}

\usepackage{lastpage}
\usepackage{array}

\newcounter{mychapcount}

\begin{document}

% first get page numbers
% for the last one, we use package lastpage

\makeatletter
\etocsetstyle{chapter}
  {}
% due to \the\numexpr\etocthepage-1
% this will only work with arabic page numbers!
%
% unfortunately, LaTeX puts in toc file only expansion of \thepage,
% losing the actual numerical page counter value. Most of the
% time, though, arabic numbers are used, so it is ok.
%
% I could similarly have used \etocthenumber to get chapter numbers
% but it would have same frailty, so better with dedicated counter
%
  {\stepcounter{mychapcount}%
   \etociffirst
    {\expandafter\xdef\csname chaprange@1\endcsname{\etocthepage-}}
    {\expandafter\xdef
     \csname chaprange@\the\numexpr\value{mychapcount}-1\endcsname
     {\csname chaprange@\the\numexpr\value{mychapcount}-1\endcsname
      \the\numexpr\etocthepage-1}%
     \expandafter\xdef\csname chaprange@\the\value{mychapcount}\endcsname
      {\etocthepage-}}%
   }
  {}
% (if one wanted to be extra sure, but TOC is typeset only
% on second pass, hence \r@LastPage will be available)
%  {\xdef\x{\x-\expandafter\expandafter\expandafter\@secondoftwo
%              \csname r@LastPage\endcsname\empty}}% 
  {\expandafter\xdef
   \csname chaprange@\the\value{mychapcount}\endcsname
  {\csname chaprange@\the\value{mychapcount}\endcsname
   \expandafter\@secondoftwo\r@LastPage}}% 

\etocsettocstyle{}{}
\tableofcontents

\edef\nbofcolumns{\the\numexpr\value{mychapcount}/2}

\etocsettocstyle{\begin{center}
                 \sffamily
                 \begin{tabular}{*{\nbofcolumns}{c}}}
                {\end{tabular}\end{center}}

\setcounter{mychapcount}{0}
\def\firstcolumn{1}

\etocsetstyle{chapter}
  {}
  {\if\firstcolumn1%
        \expandafter\@gobble
   \else\expandafter\@firstofone
   \fi
   {&}%
   \stepcounter{mychapcount}%
   \gdef\firstcolumn{0}%
   \begin{tabular}[t]{p{\dimexpr(\linewidth-1cm)/\nbofcolumns\relax}}
     \bfseries\Large\@nameuse{chaprange@\the\value{mychapcount}}\\
     \etocname
   \end{tabular}
   \ifnum\nbofcolumns=\value{mychapcount}%
     \gdef\firstcolumn{1}%
     \expandafter\@firstofone
   \else\expandafter\@gobble
   \fi
   {\\[1cm]}%
  }
  {}
  {}

\etocglobaldefs

% prevent first pass
\chapter*{\contentsname}
\ifnum\nbofcolumns>0
\tableofcontents
\fi

\makeatother

\chapter{First chapter}

A

\chapter{Second chapter}

B

\chapter{Third chapter}

C
\chapter{Fourth chapter}

D

\chapter{Fifth chapter}

E

\chapter{Sixth chapter}

F

\chapter{Seventh chapter}

\end{document}

在此处输入图片描述

注释:第一次通过时,\nbofcolumns计算结果为,因此应避免使用0第二个命令,因为较大的表格序言依赖于它。因此,我将其设置为正数。并且,超出了目录样式,因此即使在第一次通过时也始终排版(最好早点稳定页码)。\tableofcontents\nbofcolumns\chapter*{\contentsname}


只需进行一个小的修改即可使其正常工作hyperref:第一章末尾的样式\tableofcontents应修改如下:

  {\expandafter\xdef
   \csname chaprange@\the\value{mychapcount}\endcsname
  {\csname chaprange@\the\value{mychapcount}\endcsname
   \expandafter\@secondoffive\r@LastPage}}% 

\long\def\@secondoffive #1#2#3#4#5{#2}

而原来有一个\@secondoftwo

当然,还需要\usepackage{hyperref}。然后目录中的章节名称将被超链接。如果还想将页面范围超链接,则只需使用\etocthelink

   \begin{tabular}[t]{p{\dimexpr(\linewidth-1cm)/\nbofcolumns\relax}}
     \bfseries\Large\etocthelink{\@nameuse{chaprange@\the\value{mychapcount}}}\\
     \etocname
   \end{tabular}

历史注释:

在此答案的早期版本中,我想使用\etoclink。问题是这个(健壮的)宏以未展开的形式包含超链接目标。但&先前插入的 会关闭一个组,并且hyperref非全局的定义会丢失。 \etocglobaldefs对此没有影响。因此,我不得不完全重写第二个章节的样式\tableofcontents(即排版的样式),以便将组结束&标记定位在末尾,从而允许使用\etoclink

\setcounter{mychapcount}{0}
\newcounter{columnindex}

\etocsetstyle{chapter}
  {}
  {\stepcounter{mychapcount}%
   \stepcounter{columnindex}%
   \begin{tabular}[t]{p{\dimexpr(\linewidth-1cm)/\nbofcolumns\relax}}
     \bfseries\Large\etoclink{\@nameuse{chaprange@\the\value{mychapcount}}}\\
     \etocname
   \end{tabular}
   \ifnum\nbofcolumns=\value{columnindex}%
        \expandafter\@firstoftwo
   \else\expandafter\@secondoftwo
   \fi
   {\ifnum\value{mychapcount}=\value{columnindex}%
        \expandafter\@firstoftwo
   \else\expandafter\@secondoftwo
   \fi  {\setcounter{columnindex}{0}\\[1cm]}{}}%
   {&}%
  }
  {}
  {}

这确实看起来有点不合逻辑\etocname,即使在关闭组令牌之后(在发出的条件下), 仍然可以正常工作\etocnumber,而无需进一步努力,但是存在问题(内部未扩展)。\etocpage&\etocglobaldefs\etoclink\Hy@tocdestname

事实上\etocname,是的稳健变体,等等……,但并未成为 的稳健变体。也许应该这样做\etocnumber,这样用户/作者将来就不必回忆起更晦涩难懂的东西的存在……\etocpageetoc 1.08a 2015/03/13\etocthelinkedname\etoclink\etocthelink\etocthelink

更新:

以 开头etoc 1.08j\etoclink行为类似于等……,即使线条样式之前已经关闭了一个组(通常来自表格中的) ,\etocname也可以使用(即)。\etocglobaldefs&


为了使实体居中你只需要使用这个:

   \begin{tabular}[t]{p{\dimexpr(\linewidth-1cm)/\nbofcolumns\relax}}
     \centering\arraybackslash
     \bfseries\Large\@nameuse{chaprange@\the\value{mychapcount}}\\
     \centering\etocname
   \end{tabular}

在第二个\etocsetstyle{chapter}规范中。即,只需添加\centering和。如果您希望使用和,页面范围可点击,\arraybackslash请不要忘记。\etocthelinkhyperref

在此处输入图片描述


正如评论中所要求的,方法是固定列数,而不是固定行数。

\documentclass{book}

\usepackage{etoc}
\etocsettocdepth{chapter}

\usepackage{lastpage}
\usepackage{array}

\newcounter{mychapcount}

\begin{document}

% first get page numbers
% for the last one, we use package lastpage

\makeatletter
\etocsetstyle{chapter}
  {}
% due to \the\numexpr\etocthepage-1
% this will only work with arabic page numbers!
%
% unfortunately, LaTeX puts in toc file only expansion of \thepage,
% losing the actual numerical page counter value. Most of the
% time, though, arabic numbers are used, so it is ok.
%
% I could similarly have used \etocthenumber to get chapter numbers
% but it would have same frailty, so better with dedicated counter
%
  {\stepcounter{mychapcount}%
   \etociffirst
    {\expandafter\xdef\csname chaprange@1\endcsname{\etocthepage-}}
    {\expandafter\xdef
     \csname chaprange@\the\numexpr\value{mychapcount}-1\endcsname
     {\csname chaprange@\the\numexpr\value{mychapcount}-1\endcsname
      \the\numexpr\etocthepage-1}%
     \expandafter\xdef\csname chaprange@\the\value{mychapcount}\endcsname
      {\etocthepage-}}%
   }
  {}
% (if one wanted to be extra sure, but TOC is typeset only
% on second pass, hence \r@LastPage will be available)
%  {\xdef\x{\x-\expandafter\expandafter\expandafter\@secondoftwo
%              \csname r@LastPage\endcsname\empty}}% 
  {\expandafter\xdef
   \csname chaprange@\the\value{mychapcount}\endcsname
  {\csname chaprange@\the\value{mychapcount}\endcsname
   \expandafter\@secondoftwo\r@LastPage}}% 

\etocsettocstyle{}{}
\tableofcontents

%\edef\nbofcolumns{\the\numexpr\value{mychapcount}/2}

\def\nbofcolumns{2}

\etocsettocstyle{\begin{center}
                 \sffamily
                 \begin{tabular}{*{\nbofcolumns}{c}}}
                {\end{tabular}\end{center}}

\newif\iffirstpass
\firstpasstrue
\ifnum\value{mychapcount}>\z@
  \firstpassfalse
\fi

\setcounter{mychapcount}{0}
\def\columnindex{0}

\etocsetstyle{chapter}
  {}
  {\ifnum\columnindex=\z@
        \expandafter\@gobble
   \else\expandafter\@firstofone
   \fi
   {&}%
   \stepcounter{mychapcount}%
   \xdef\columnindex{\the\numexpr1+\columnindex}%
   \begin{tabular}[t]{p{\dimexpr(\linewidth-1cm)/\nbofcolumns\relax}}
     \centering\arraybackslash
     \bfseries\Large\@nameuse{chaprange@\the\value{mychapcount}}\\
     \centering\etocname
   \end{tabular}
   \ifnum\columnindex=\nbofcolumns\space
     \gdef\columnindex{0}%
     \expandafter\@firstofone
   \else\expandafter\@gobble
   \fi
   {\\[1cm]}%
  }
  {}
  {}

\etocglobaldefs

% prevent first pass
\chapter*{\contentsname}
\iffirstpass\else
\expandafter\tableofcontents
\fi

\makeatother

\chapter{First chapter}

A

\chapter{Second chapter}

B

\chapter{Third chapter}

C
\chapter{Fourth chapter}

D

\chapter{Fifth chapter}

E

\chapter{Sixth chapter}

F

\chapter{Seventh chapter}

\end{document}

(我还更新了方法以避免目录在第一遍就被执行)。

在此处输入图片描述

相关内容