我正在实现一个从未使用过 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
,这样用户/作者将来就不必回忆起更晦涩难懂的东西的存在……\etocpage
etoc 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
请不要忘记。\etocthelink
hyperref
正如评论中所要求的,方法是固定列数,而不是固定行数。
\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}
(我还更新了方法以避免目录在第一遍就被执行)。