LaTeX教程(014)-LaTeX文档结构(14)

LaTeX教程(014)- LaTeX \LaTeX LATEX文档结构(14)

2.3.3 multitoc - 将目录设置为多栏

multitoc包的使用方法相当简单,只需要调用这个包,并将要设置为多栏(默认是双栏)的目录指定到包选项中即可。如\usepackage[toc]{multitoc},设置的就是目录列表,除此之外还可以指定loflot(图形列表和表格列表)。我们用一个例子演示一下:

\documentclass{article}
\usepackage{geometry}
\usepackage[toc]{multitoc} %将目录设置为双栏
\begin{document}
\tableofcontents
\section{section one}
\subsection{subsection one}
\section{section two}
\subsection{subsection two}
\subsection{subsection three}
\subsection{subsection four}
\end{document}

编译(只截取目录):

在这里插入图片描述

很用有使用超过双栏的时候,但是在必要的时候,你可以重定义\multicolumntoc\multicolumnlof或者\multicolumnlot,将它们重定义为你想要的数字(栏数)。如上面的例子中放置一行\renewcommand{\multicolumntoc}{3},可将目录设置为3栏:

在这里插入图片描述

2.3.4 LaTeX \LaTeX LATEX的底层接口

我们前面讲了如何通过一些包定制目录,在这一节的最后一个小节中,我们介绍一下 LaTeX \LaTeX LATEX为目录提供的底层接口,其中有一些命令是我们之前用过的。实际上titletoc包也在底层调用了这些接口。

将信息写入目录文件

有两个命令用来将数据写入目录文件: \addcontentsline\addtocontents。它们自动被标题命令和图表的标签命令调用,当然,如果有必要的话,我们是可以直接手动调用它们的。

\addcontentsline{ext}{type}{text}

\addcontentsline命令将text参数中的内容,连同一些附带的信息,比如当前的页码等,一起放入后缀为ext的文件中(这里是指ext参数中填的内容,通常是loftoc或者lot,分别对应我们已经熟悉的三种列表文件)。最好用\protecttext内容保护起来。type参数中填写当前条目的类型,对于.toc文件来说,通常就是标题的类型,如chaptersection等(不带反斜线),对于.lof.lot文件来说,通常分别是figure或者table

\allcontentsline命令会在使用章节划分命令(如\chapter\section等),或者浮动体环境中的\caption命令时自动调用。然而,该命令没有为条目的编号单独分配一个参数,而是关于标题的一切文本内容,只留了一个text参数,那么我们如何通过该命令让 LaTeX \LaTeX LATEX知道当前条目有没有编号,以及编号是什么呢?我们可以在text参数中使用\numberline命令:

\protect\numberline{number}heading

heading就是我们的标题文本,number是我们要填的标题编号。例如,在一个插图环境(figure)中使用\caption命令, LaTeX \LaTeX LATEX就会调用命令:

\addcontentsline{lof}{figure}{\protect\numberline{\thefigure}caption text}

\numberline会直接被写入文件中,而\thefigure会被替换成一个编号(当前图片的编号),被写入lof文件中。

在排版目录列表期间,一个合适的\numberline的定义会被用来以一种特定的方式排版条目的编号,如插入一段额外的距离,或者变一种不同的字体等。不足之处是,这种方式不具有更好的通用性,它没有为编号单独划分一个参数,你不能轻易地对编号进行任意的改变,并且它需要一个好的\numberline定义,这并不是那么容易提供的。

\addtocontents{ext}{test}

\addtocontents命令没有type参数,它被用来插入特殊格式的条目,和任何其他的目录行都不直接相关。例如,标准类的\chapter命令会调用以下命令:

\addtocontents{lof}{\protect\addvspace{10pt}}
\addtocontents{lot}{\protect\addvspace{10pt}}

.lof.lot文件中额外放置一段空白,来将不同章的图表条目分开。使用\addvspace(只能在垂直模式下使用)在不同的章之间至多插入10pt的距离,如果一章中没有图表,也不会产生奇怪的缺口。这是\addvspace的特殊之处,如果某处插入多个\addvspace命令,那么只有参数最大的会生效。例如

abc...

\addvspace{10pt} %

\addvspace{20pt}

\addvspace{10pt}

def...

只会在abc…和def…之间插入一段20pt的垂直距离。然而,\addcontentsline\addtocontents\addvspace在作为用户层命令使用时,很容易出现奇怪的错误,尤其是\addvspace,它只能在垂直模式下使用,这就意味着,\addcontentsline设置的条目必须以垂直模式结束。因此你需要了解这样的条目是如何被处理的,以至于能够在其中进行任意的格式化操作。而这正是下一节的任务。

如果文档使用了\include声明,那么\addcontentsline\addtocontents命令的使用就有一个局限,它们都不能和\include命令在同一层级下使用。例如:

\addtocontents{toc}{\protect\setcounter{tocdepth}{1}}
\include{sect1}

其中sect1.tex文件中含有\section命令,这样就会得到一个意料之外的结果,.toc文件中会有以下内容:

\contentsline {section}{\numberline {1}Section from sect1}{2}{}%
\setcounter{tocdepth}{1}

可以看到这两行命令的顺序颠倒了,\section条目本应在\setcounter{tocdepth}{1}命令的后面,现在跑到前面去了。解决方法就是避免使用\include,或者把\addtocontents\addcontentsline命令放在\include所包含的文件里面。

排版一个目录列表

在上一篇中,我们做了一个演示,我们手动创建了一个.toc文件,并且还手动修改过里面的内容,然后使用\input命令将.toc文件插入到了文档中。我们知道,对于文档中的条目,真正起作用的是.toc.lof.lof文件中的那些内容。

而从上面的内容中,我们又知道了,目录条目的产生都缘于\addcontentsline\addtocontents命令或隐示或显示的调用,那么在这两个命令被执行之后,接下来发生了什么?它们是如何对.toc.lof.lof文件产生影响的?

实际上, LaTeX \LaTeX LATEX执行命令

\addcontentsline{ext}{type}{text}

时,就会在后缀名为ext(这取决于我们在这个参数里填的是什么)的文件中放置一行(连同注释符%一起):

\contentsline{type}{text}{page}{anchor-name}%

其中page是当前\addcontentsline放置的位置在文档中的页码。anchor-name默认是空的,除非加载了hyperref包。这种情况下该参数内会被填入一个超链接的锚点名(anchor name)。

\addtocontents{ext}{text}则更简单,它仅仅是将text参数的内容复制到后缀名为ext的文件中,不会写入其他更多的信息。因此,一个典型的目录列表文件包含一些\contentsline命令,可能还包含一些由\addtocontents命令写入的特殊格式的文本。我们做个演示:

\documentclass{article}
\usepackage[a5paper,margin=1in]{geometry}
\begin{document}
\tableofcontents
\section{section one}
\subsection{subsection one}
\stepcounter{subsection}
\addcontentsline{toc}{subsection}%
{\protect{\numberline{\thesubsection}}this is a test of add contentsline}
\section{section two}
\addtocontents{toc}{the is a test of addtocontents}
\end{document}

编译:

在这里插入图片描述

我们使用\addcontentsline添加了一个subsection的条目,并且将编号\thesubsection也放置了进去,由于我们没有使用\subsection命令,所以subsection的计数器不会自动递增,我们要使用命令\stepcounter使subsection加1。

\addtocontents命令没有type参数,但是我们从格式上可以看出,添加的文本的默认层级等同于subsection

打开.toc文件,可以看到以下内容:

\contentsline {section}{\numberline {1}section one}{1}{}%
\contentsline {subsection}{\numberline {1.1}subsection one}{1}{}%
\contentsline {subsection}{{\hbox to\@tempdima {1.2\hfil }}this is a test of add contentsline}{1}{}%
\contentsline {section}{\numberline {2}section two}{1}{}%
the is a test of addtocontents

当然,既然最终起作用的命令是\contentsline,那么我们也可以在文档中直接使用\contentsline命令来创建一个目录。

下面展示一个典型的例子。注意大多数(并非全部)标题编号都是作为\numberline的参数输入的,以便能有统一的、合适的缩进。出于历史的原因, LaTeX \LaTeX LATEX在这一点上并不一致,标准类的\part命令的编号并没有使用\nunmberline命令,而是直接为其指定了一种特殊的格式。

\documentclass{book}
\usepackage[a5paper,margin=1in]{geometry}
\setcounter{tocdepth}{3}
\begin{document}
\tableofcontents
\contentsline {part}{I\hspace{1em}Part}{2}{}%
\contentsline{chapter}{\numberline{1}A-Head}{2}{}%
\contentsline{section}{\numberline{1.1}B-Head}{3}{}%
\contentsline{subsection}%
{\numberline{1.1.1}C-Head}{4}{}%
\contentsline{subsection}%
{\numberline{}With Empty Number}{5}{}%
\contentsline{subsection}{Unnumbered C-Head}{6}{}%
\contentsline{subsection}%
{\numberline{1.1.2}Another C-Head}{8}{}%
\contentsline{section}%
{\numberline{1.2}Another B-Head}{10}{}%
\end{document}

编译:

在这里插入图片描述

\contentsline命令执行后,又会根据type参数的不同,调用\l@type命令。每一种\l@type命令都有一个定义,例如,在report类中你可以看到以下定义:

\newcommand\l@section {\@dottedtocline{1}{1.5em}{2.3em}}
\newcommand\l@subsection {\@dottedtocline{2}{3.8em}{3.2em}}
\newcommand\l@subsubsection{\@dottedtocline{3}{7.0em}{4.1em}}
\newcommand\l@paragraph {\@dottedtocline{4}{10em}{5em}}
\newcommand\l@subparagraph {\@dottedtocline{5}{12em}{6em}}
\newcommand\l@figure {\@dottedtocline{1}{1.5em}{2.3em}}
\newcommand\l@table {\l@figure}

根据定义,\l@type实际上是被指定了3个参数的命令\@dottedtocline(它实际上有5个参数),被指定了的参数分别是level-条目层级、indent-缩进和numwidth-编号宽度,剩下两个保留参数分别是textpage,它会自动从\contentsline命令中接收到。我们知道其实还有一个anchor-name参数,这个参数大多数时候是空的,而如果指定了hyperref包,这些定义就会改变,同时最后一个参数也会被接收到。

注意,有一些标题以一种更复杂的方式建立它们的目录条目,这就使得标准类中的\l@part\l@chapter(包括article类中的\l@section)并不是使用\@dottedtocline定义的。通常它们用一些特殊的格式命令,可能会省略引导线或者用更大的字体排版等。

所以要定义这些条目列表的布局,就必须声明合适的\l@type命令(这些正是titletoc包的\dottedcontents\titlecontents所做的事)。下面我们展示一种不通过宏包来使用\@dottedtocline的简单方法。这个命令的形式如下:

\@dottedtocline{level}{indent}{numwidth}{text}{page}

最后两个命令和\contentsline的第二和第三个命令保持一致,\@dottedtocline通常会被\contentsline所调用。其他的命令如下:

  • level: 条目的层级。
  • indent: 从左边距开始的缩进。
  • numwidth: 用来放置条目编号的盒子的宽度(如果使用了\numberline的话),对于多行的标题文本,这些缩进对所有行都有效。

另外,还使用了以下这些全局格式参数,它们对所有出现的条目生效。这些参数都是长度数值。要改变它们,必须使用\renewcommand重定义。

  • \@pnumwidth: 放置页码的盒子的宽度
  • \@tocrmarg: 条目文本的右侧缩进,对于多行文本来说,它是除最后一行的所有行的缩进。可以是一个弹性长度。
  • \@dotsep: (引导线中)两个点之间的间隔,单位是mu(18mu-1em),这里填入一个数字(如1.7,或2),单位不用写。你可以通过将数字设置的足够大来让这些点显示不出来。

我们用一张图表示这些参数的作用位置:

在这里插入图片描述

numwidth参数中的编号靠左对齐(如果有编号的话)。我们可以通过改变indentnumwidth的设置来为嵌套的条目实现合适的缩进。

有时候对它们进行调整是必须的,如果你使用的是标谁类,比如article,而文档的篇幅又很长,那么就可能会出现11.12这样的编号(第11节第12小节),此时原本的放置编号的空间可能就不太够用了,编号和文本会离得很近,甚至重叠。我们作个演示:

\documentclass{article}
\usepackage[a5paper,margin=1in]{geometry}
\setcounter{tocdepth}{3}
\begin{document}
\contentsline{section}{\numberline{11}A-Head}{3}{}%
\contentsline{subsection}{\numberline{11.1}B-Head}{3}{}%
\ldots %
\contentsline{subsection}{\numberline{11.12}B-Head}{7}{}%
\end{document}

编译:

在这里插入图片描述

这种情况下,可以重定义\@subsection为编号保留更多的空间(调整\@dottedtocline的第三个参数),我们作个演示:

\documentclass{article}
\usepackage[a5paper,margin=1in]{geometry}
\setcounter{tocdepth}{3}
\makeatletter
\renewcommand\l@subsection{\@dottedtocline{2}{1.5em}{3em}}
\makeatother
\begin{document}
\contentsline{section}{\numberline{11}A-Head}{3}{}%
\contentsline{subsection}{\numberline{11.1}B-Head}{3}{}%
\ldots %
\contentsline{subsection}{\numberline{11.12}B-Head}{7}{}%
\end{document}

编译:

在这里插入图片描述

这里要注意, LaTeX \LaTeX LATEX的内部命令(就是带@符号的命令)在文档中使用时要用\makeatletter\makeatother将其包含其中。其他类似的命令的重定义方式也和\@subsection一样,我们不再一一演示。

少数时候我们可能需要扩展放置页码的盒子的宽度,例如,如果页码是根据part设置的,如"A-78"、"B-328"等,那么默认的空间可能就不够了,然后弹出一个Overfull hbox的警告(盒子溢出)。一种解决方法就是重定义\@pnumwidth的值,使其至少能够放置最宽的页码:

\makeatletter
\renewcommand\@pnumwidth{2cm}
\makeatother

\@pnumwidth一经调整,通常\@tocrmarg也要跟着调整,以保证其布局的一致性。

这些例子能让我们看出titletoc提供的高级接口的优势,使用像\contentspush这样的命令显然是一种更简单的解决方法。

添加其他的目录文件

有些时候你可能会想要标记一些其他的数据,并将其做成列表。这样你就需要创建一个新的目录文件。

例如,假设你想要在一个article中收集所有对艺术家的注释,那么你需要定义两个命令。第一个是\artist,用来排版艺术家的姓名,并且将这两个参数联结起来,同时将当前命令在文档中所处的位置写为当前的页码记录到文件中。第二个是\listofartistnotes,用来读取文件中的内容,并且将这些内容布局在文档中插入该文件的地方。

要实现这一点,\listofartistnotes命令要调用\@starttoc{ext},它会读取后缀为ext的文件(这里指我们在ext处填的参数),这个命令也会被\tableofcontents\listoffigures\listoftables调用。这个文件的后缀是自定义的,可以是任意没有用过的字符串,如.rec。我们可以单独创建一章,如\chapter*{Notes on artists},用来放置这个列表(只需要将命令\listofartistnotes放置在这一章中),如果想要的话,也可以使用\addcontentsline将这一章的标题放置在目录文件中(.toc)。

而真正控制.rec文件中的条目排版的命令是\l@note,这是一个需要我们定义的命令。在下面的例子中,这些注释都分别作为一个段落排版,并且后面紧跟着一个斜体的页码。如果不想直接定义页码的样式命令,也可以使用titletoc's接口,如\titlecontents{note}...

\documentclass{article}
\usepackage[a5paper,margin=1in]{geometry}
\newcommand\artist[2]{#1\addcontentsline{rec}{note}{#1: #2}}

\makeatletter
\newcommand\listofartistnotes%
{\section*{Notes on artists}\@starttoc{rec}}%
\newcommand\l@note[2]{\par\noindent#1,~\textit{#2}\par}
\makeatother
\begin{document}
The version of Ravel's Boléro by \artist{Jacques Loussier Trio}{A strange experience} is rather unusual. Quite interesting is Davis' Blue in Green
by \artist{Cassandra Wilson}{A wonderful version}.
\listofartistnotes
\end{document}

编译:

在这里插入图片描述
关注【年轻人 你渴望力量么】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/781281.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GIT 使用相关技巧记录

目录 1、commit 用户信息变更 全局用户信息(没有特殊配置的情况下默认直接用全局信息) 特定仓库用户信息(只针对于当前项目) 方法一:修改config文件 方法二:命令方式 2、idea同一代码推向多个远端仓库…

如何在应用运行时定期监控内存使用情况

如何在应用运行时定期监控内存使用情况 在 iOS 应用开发中,实时监控内存使用情况对于优化性能和排查内存泄漏等问题非常重要。本文将介绍如何在应用运行时定期监控内存使用情况,使用 Swift 编写代码并结合必要的工具和库。 1. 创建桥接头文件 首先&…

k8s 部署 springboot 项目内存持续增长问题分析解决

写在前面 工作中遇到,请教公司前辈解决,简单整理记忆博文内容涉及一次 GC 问题的分析以及解决理解不足小伙伴帮忙指正 😃,生活加油 99%的焦虑都来自于虚度时间和没有好好做事,所以唯一的解决办法就是行动起来,认真做完…

STM32-USART

本内容基于江协科技STM32视频学习之后整理而得。 文章目录 1. 串口通信协议1.1 通信接口1.2 串口通信1.3 硬件电路1.4 电平标准1.5 串口参数及时序1.6 串口时序 2. USART串口通信2.1 USART简介2.2 USART框图2.3 USART基本结构2.4 数据帧2.5 数据帧-配置停止位2.6 起始位侦测2.…

大连外贸建站公司wordpress主题模板

Robonaut萝卜纳特WP外贸站模板 适合用于工业机器人公司出口做外贸搭建公司官方网站使用的WordPress模板。 https://www.jianzhanpress.com/?p7091 优衣裳WordPress外贸建站模板 简洁的wordpress外贸独立站模板,适合服装、衣服、制衣外贸公司搭建公司官方网站使用…

ByteTrack论文阅读笔记

目录 ByteTrack: Multi-Object Tracking by Associating Every Detection Box摘要INTRODUCTION — 简介BYTE算法BYTE算法用Python代码实现实验评测指标轻量模型的跟踪性能 总结SORT算法简介ByteTrack算法和SORT算法的区别 ByteTrack: Multi-Object Tracking by Associating Eve…

location匹配和rewrite重定向

目录 location 匹配 location匹配的分类和优先级 优先级细分 实际网站中的使用规则 1.用精确匹配来实现网站的首页 访问网站的首页 ( /) 2.用正则匹配来实现静态请求的页面和图片 匹配静态页面 访问图片或者指定的后缀名 3.用一般匹配转发.php…

【qt】TCP的监听 (设置服务器IP地址和端口号)

TCP监听是在自己的IP地址上进行的。 当一个TCP服务器程序启动时,它会绑定到一个特定的IP地址和一个端口号上,以便可以接收来自该IP地址和端口号的传入连接请求. 所以我们要先来获取主机的IP地址和设置端口号. 注意: 服务器程序无法任意设置IP地址&…

数据结构学生信息顺序表

主程序 #include "fun.h" int main(int argc, const char *argv[]) { seq_p Screate_seq(); stu data; printf("请问要输入几个学生的数据:"); int n; scanf("%d",&n); while(n--) { prin…

cloudflare tunnels tcp

这里是官网的说明Cloudflare Tunnel Cloudflare Zero Trust docs 根据实际情况安装环境 tunnels除了http,https协议是直接暴露公网,tcp是类似ssh端口转发。 在需要内网穿透的局域网找一条机子部署代理 我这边是window cloudflared tunnel login #生成一个身份校…

防火墙概述

1、防火墙 防火墙顾名思义就是防止火灾发生时,火势烧到其它区域,使用由防火材料砌的墙。在网络安全中,防火墙的作用就是保护本地网络不受到外部网络或恶意程序的伤害。 防火墙的核心任务是控制和防护,即通过安全策略识别流量并做…

【周末闲谈】AI“抢饭碗”?绝对不是危言耸听

AI是在帮助开发者还是取代他们? 在软件开发领域,生成式人工智能(AIGC)正在改变开发者的工作方式。无论是代码生成、错误检测还是自动化测试,AI工具正在成为开发者的得力助手。然而,这也引发了对开发者职业前景和技能需求变化的讨论。AI究竟是在帮助开发者还是取代他们?…

【论文阅读】-- Visual Analytics for Model Selection in Time Series Analysis

时间序列分析中模型选择的可视化分析 摘要1 引言2 相关工作3 问题表征3.1 Box-Jenkins 方法论3.2 ARIMA 和季节性 ARIMA 模型3.3 模型规范3.4 模型拟合3.5 模型诊断 4 需求分析5 VA 用于时间序列分析中的模型选择5.1 VA选型流程说明5.2 TiMoVA 原型5.2.1 实施选择5.2.2 图形用户…

【JavaSE复习】数据结构、集合

JavaSE 复习 1.数据结构1.1 查找1.1.1 基本查找1.1.2 二分查找1.1.3 插值查找1.1.4 斐波那契查找1.1.5 分块查找1.1.6 分块查找的扩展(无规律数据) 1.2 排序1.2.1 冒泡排序1.2.2 选择排序1.2.3 插入排序1.2.4 快速排序 2. 集合2.1 基础集合2.1.1 集合和数…

MyBatis中二级缓存的配置与实现原理

大家好,我是王有志,一个分享硬核 Java 技术的金融摸鱼侠,欢迎大家加入 Java 人自己的交流群“共同富裕的 Java 人”。 上一篇文章《MyBatis中一级缓存的配置与实现原理》中,我们已经掌握了 MyBatis 一级缓存的配置(虽然…

使用AOP思想实现开闭原则下的流水日志输出

主要实现思想: 通过实现Convert接口来抽取公共组件,获取想要的标准模型。 现在有两个订单场景,一个保存订单,一个为更新订单。构造如下的服务类: import org.springframework.stereotype.Service;Service public clas…

pwm 呼吸灯(如果灯一直亮或者一直灭)

(这个文章收藏在我的csdn keil文件夹下面) 如果这样设置预分频和计数周期,那么算出来的pwm频率如下 人眼看起来就只能是一直亮或者灭,因为pwm的频率太高了,但是必须是频率够高,才能实现呼吸灯的缓慢亮缓慢…

Django之项目开发(一)

一、项目的生命周期介绍 传统Web 项目的生命周期指的是从开始构建一个网站到该网站完成并维护的整个过程。通常情况下,Web 项目的生命周期包括以下几个阶段 需求分析阶段:在这个阶段,项目组会与客户进行沟通,确定网站的功能、内容和设计。 主要由产品经理参与产出思路与方案…

ChatGPT-4o大语言模型优化、本地私有化部署、从0-1搭建、智能体构建等高级进阶

目录 第一章 ChatGPT-4o使用进阶 第二章 大语言模型原理详解 第三章 大语言模型优化 第四章 开源大语言模型及本地部署 第五章 从0到1搭建第一个大语言模型 第六章 智能体(Agent)构建 第七章 大语言模型发展趋势 第八章 总结与答疑讨论 更多应用…

Nginx auth 的权限验证

基本流程 整个流程为;以用户视角访问API开始,进入 Nginx 的 auth 认证模块,调用 SpringBoot 提供的认证服务。根据认证结果调用重定向到对应的 API 接口或者 404 页面。 查看版本保证有 Nginx auth 模块 由于 OpenAI 或者本身自己训练的一套…