TEX:显示文本

本文详细介绍了LaTeX中如何选择和设置字体,包括西文字体fontspec宏包的使用,中文字体xeCJK宏包的配置,以及字体形状、大小、系列的选择。此外,还涵盖了列表、定理声明、表格构造和脚注等格式控制方法。
摘要由CSDN通过智能技术生成

字体选择

\fontencoding{编码} 
\fontfamily{族} 
\fontseries{权与宽度}
\fontshape{形状}
\fontsize{尺寸}{基线间距}

\fontseries中的参数值权与宽度表示字符的权( =粗细程度)和宽度。\fontseries{权与宽度}的参数值是由对应于权的字母后接对应与宽度的字母组成。因此ebsc表示权为较黑,宽度为较松,而bx意味着权为黑,宽度为松。同任何非正常权或宽度组合时,字母m可以忽略;如果两者都是正常,那么只要给出m就可以了。

在这里插入图片描述

\fontshape中,参数值形状是n, it, sl或sc字母组合中的一种,分别表示正常(直立)、斜体、slanted 或小体大写字母。
\fontsize属性命令有两个参数值,第一个参数值尺寸表示字体以点为单位的大小(不显式地给出pt单位),而第二个参数值基线间距是从一个基线到下一个基线的竖直距离。第二个参数值成为\baselineskip的新值( 3.2.3节)。例如, \fontsize{12}{15}选择12pt 的字体尺寸,行间距为15pt。( 第二个参数值可以给出单位,例如15pt,但如果没有给出单位,就认为是pt。)

一但五个属性都已设置好,就可以用\selectfont命令选择字体。这里的新特征是各种属性是彼此独立的。改变其中一个,并不会改变另一个。例如选择:\fontfamily{cmr} \fontseries{bx} \fontshape{n} \fontsize{12}[15}已经生成了一种直立、黑体、松的罗马字体,尺寸为12pt,行间距15pt ,那么当后来用\fontfamily{cmss}选择一种sansn serif 字体,那么属性中的权和宽度bx,形状n,尺寸12(15pt)在进行下一\selectfont调用时继续有效。

等价地,可以利用下面这条命令来定义除尺寸外的所有属性,并同时马上激活字体: \usefont{代码}{族}{序列}{形状}

字体

预定义的字体族有3种:默认的罗马字体族(roman family)、无衬线字体族(sans serif family)和打印机字体族(typewriter family)。

字体族带参数命令声明命令效果
罗马\textrm{<文字>}\rmfamilyRoman font family罗马
无衬线\textsf{<文字>}\sffamilySans serif font family无衬线
打字机\texttt{<文字>}\ttfamilyTypewriter font family 打字机

预定义的字体形状:默认的直立(upright shape,也称roman shape)、意大利(italic shape)、倾斜(slanted shape)、小型大写(small capitals shape)。我们通常所说的“倾斜”往往是指意大利形状,因此我们在设置倾斜字体的时候往往都是指定意大利形状字体。

字体形状带参数命令声明命令效果
直立\textup{<文字>}\upshapeUpright shape直立
意大利\textit{<文字>}\itshapeItalic shape意大利
倾斜\textsl{<文字>}\slshapeSlanted shape倾斜
小型大写\textsc{<文字>}\scshapeSMALL CAPITALS SHAPE小型大写

字体形状这些概念源于英文,对于中文来说字体并没有这么复杂。中文中并没有倾斜字体,我们在 word 中看到的倾斜字体实际是通过对字符进行水平错切得到的伪斜体(对应的还有伪粗体是对字符多次略微错位输出得到的)。一般情况下我们使用楷体来对应英文中的倾斜字体,用黑体来替代英文中的加粗字体。这一点后面的示例会进行说明。如果我们想使用伪斜体请查阅相关文档。

预定义的字体系列:默认的中等(medium)和加宽加粗(bold extended)两类:

字体系列带参数命令声明命令效果
中等\textmd{<文字>}\mdseriesMedium series中等
加宽加粗\textbf{<文字>}\bfseriesBold extended series加宽加粗

fontspec宏包

设置西文字体

\setmainfont{⟨font⟩}[⟨font features⟩] 
\setsansfont{⟨font⟩}[⟨font features⟩] 
\setmonofont{⟨font⟩}[⟨font features⟩]

根据字体形状控制字体

BoldFont = ⟨font name⟩
ItalicFont = ⟨font name⟩
BoldItalicFont = ⟨font name⟩
SlantedFont = ⟨font name⟩
BoldSlantedFont = ⟨font name⟩
SmallCapsFont = ⟨font name⟩
UprightFont = ⟨font name⟩

为不同的字体形状选择不同的特征

BoldFeatures={⟨features⟩}
ItalicFeatures={⟨features⟩}
BoldItalicFeatures={⟨features⟩}
SlantedFeatures={⟨features⟩}
BoldSlantedFeatures={⟨features⟩}
SmallCapsFeatures={⟨features⟩}
UprightFeatures={⟨features⟩}

使用Upright-,SmallCaps,Bold-,Italic-,分离出特定字体,单独为他们定义优先于全局定义的特征。不同特征定义直接可以互相嵌套,以便为更精细的字体设置特征。

\fontspec{texgyretermes}[
Extension = {.otf},
UprightFont = {*-regular}, ItalicFont = {*-italic},
BoldFont = {*-bold}, BoldItalicFont = {*-bolditalic},
UprightFeatures={Color = 220022,SmallCapsFeatures = {Color=115511} },
ItalicFeatures={ Color = 2244FF,SmallCapsFeatures = {Color=112299} },
BoldFeatures={ Color = FF4422,SmallCapsFeatures = {Color=992211} },
BoldItalicFeatures={ Color = 888844,SmallCapsFeatures = {Color=444422} },
]

为不同的字体大小状选择不同的特征

SizeFeatures = {
... 
	{ Size = ⟨size range⟩, ⟨font features⟩ },
    { Size = ⟨size range⟩, Font = ⟨font name⟩, ⟨font features⟩ }, 
    ... 
}

SizeFeatures里面可以嵌套上小节中的特征定义如BoldFeatures

SizeFeature功能比前面讨论的功能稍微复杂一些。它允许为给定字体系列选择不同的字体和不同的字体功能,因为点大小不同。它采用逗号分隔的列表(以大括号分隔),每个尺寸的要素列表以逗号分隔,每个子列表必须包含用于声明大小范围的Size选项,并且可以选择字体,达到根据大小更改字体。也可以添加的其他(常规)fontspec功能。

InputFont sizes
Size=X-s ≥ \ge X
Size=-Ys < \lt <Y
Size=X-YX ≤ \le s < \lt <Y
Size=Xs=X

中文字体选择

%在导言区使用以下代码,获得中文支持 
\documentclass[utf8,a4paper,12pt]{ctexart} 
%或者 
\documentclass{article} 
\usepackage{ctex}
字体命令1命令2
宋体\songti\CJKfamily{zhsong}
黑体\heiti\CJKfamily{zhhei}
仿宋\fangsong\CJKfamily{zhfs}
楷书\kaishu\CJKfamily{zhkai}
隶书\lishu\CJKfamily{zhli}
圆体\youyuan\CJKfamily{zhyou}
微软雅黑\yahei\CJKfamily{zhyahei}

\textrm{} 相当于默认字体,即中文宋体,英文罗马

\textit{} 默认中文楷书,若前面定义过下文中文字体,则为定义字体,英文斜体

\textsf{} 中文微软雅黑,英文无衬线体

\texttt{} 中文仿宋,英文等宽字体

注意 textsf 会改变中文标点符号 但常规的字体加粗如 \textbf{} 可以互用

xeCJK宏包

xeCJK是一个XELATEX宏包,用于排版中日韩(CJK)文字,主要功能:

  1. 分别设置CJK和英文
  2. 自动忽略 CJK 文字间的空格而保留其它空格,允许在非标点汉字和英文字母 (a – z, A – Z) 间断行;
  3. 提供多种标点处理方式:全角式、半角式、开明式、行末半角式和 CCT 式;
  4. 自动调整中英文间空白。

xeCJK 还需要通过fontspec 宏包来调用系统字体。xeCJK 会自动根据需要载入这些宏包。

xeCJK⟨key⟩=⟨var⟩ 的形式提供宏包选项,你可以在调用宏包的时候直接设置这些选 项,也可以在调用宏包之后使用\xeCJKsetup 来设置这些选项。xeCJK 内部调用 fontspec 宏 包,可以在调用 xeCJK 的时候,使用它的宏包选项。xeCJK 会将 fontspec 的选项传递给它。

\usepackage[<key>=<var>,...]{xeCJK}
\xeCJKsetup{<key1>=<val1>,<key2>=<val2>,...}

字体选择与设置

\setCJKmainfont{<font name>}[<font features>]或
\setCJKmainfont[<font features>]{<font name>}

设置正文罗马族的 CJK 字体,影响\rmfamily\textrm的字体。后面两个参数继承自 fontspec 宏包,<font features> 表示字体属性选项,<font name> 是字体名。字体名可以是字体族名,也可以是字体的文件名。出于兼容性考虑,字体属性可选项可以放在字体名称前面,也可以放在后面。如果可选项放在后面,字体名称与可选项之间不要有空格或者换行。

选项AutoFakeBold和FakeBold可以对没有定义加粗体的中文加粗

\setCJKsansfont{<font name>}[<font features>]或
\setCJKsansfont[<font features>]{<font name>}

设置正文无衬线族的 CJK 字体,影响 \sffamily\textsf 的字体。

\setCJKmonofont{<font name>}[<font features>]或
\setCJKmonofont[<font features>]{<font name>}

设置正文等宽族的 CJK 字体,影响 \sffamily\textsf 的字体。

声明新的CJK字体族<family>并指定字体:

\setCJKfamilyfont{<family>}{<font name>}[<font features>]或
\setCJKfamilyfont{<family>}[<font features>]{<font name>}
  • \CJKrmdefault保存 \textrm\rmfamily 所使用的 CJK 字体族,默认值是 rm

  • \CJKsfdefault保存 \textsf\sffamily 所使用的 CJK 字体族,默认值是 sf

  • \CJKttdefault保存 \texttt\ttfamily 所使用的 CJK 字体族,默认值是 tt

  • \CJKfamilydefault保存 \textnormal\normalfont 所使用的 CJK 字体族。。类似西文字体的\familydefault。 初始值是 \CJKrmdefault。如果没有在导言区中修改它,xeCJK 会在导言区结束的时候根据 西文字体的情况自动更新 \CJKfamilydefault。因此,在导言区里使用

    \renewcommand{\familydefault}{\sfdefault}
    

    就可以将全文的 CJK 和西文默认字体都改为无衬线字体族。

\CJKfamily{⟨family⟩}
\CJKfamily + {⟨family⟩}
\CJKfamily - {⟨family⟩}

用于在文档中切换 CJK 字体族,⟨family⟩ 必须预先声明。\CJKfamily 仅对 CJK 字符类有效, \CJKfamily+ 对所有字符类均有效,\CJKfamily- 对非 CJK 字符类有效。当 \CJKfamily+ 和 \CJKfamily- 的参数为空时,则使用当前的 CJK 字体族。

\setCJKmathfont{⟨font name⟩}[⟨font features⟩] 或
\setCJKmathfont[⟨font features⟩] {⟨font name⟩}

设置数学公式中的 CJK字体族。如果使用了 CJKmath 选项,但是没有使用 \setCJKmathfont 设置数学公式中的 CJK 字体,那么将使用 \CJKfamilydefault 作为数学公式中的 CJK 字体。

XELATEX字体名查找

XETEX 通常使用 fontconfig库查找和调用字体,因此,可以用fc-list命令显示可用的 字体。在命令行(Windows 的“命令提示符”,Linux 的 Console)下运行以下命令:

fc-list > fontlist.txt

为了方便起见,fc-list 命令也可以加上各种选项控制输出格式,例如如果只要列出所 有的中文字体的字体族名,可以用命令:

fc-list -f "%{family}\n" :lang=zh >zhfont.txt

字体集与符号

TEX和LATEX显示所用的字符集是由程序实现的。对于不同的版本,约有400到800个的字体文件,分别相应于不同的字样、尺寸和放缩比例,每个文件由128 (将来会是256 )个字符或符号组成。
每个字符集分别存贮在它们自己的文件中。在附录E中列出了75个标准字符文件的名称,其中很多就是打印出来的。
在字符集中的每个符号都是通过一个介于0到127 (或者255 )之间的数来编址的。命令

\symbol{数}

标识号也可以用八进制(前缀’)或十六进制(前缀")数给出。因此符号命令\symbol{28}\symbol{'34}\symbol{"1C}是一样的,都会生成 ϕ \phi ϕ​​​
\symbol命令也可以用来生成还没有为它定义其它命令的符号,例如,{\tt\symbol{ '40}\symbol{ '42}\symbol{'134}}得到​u"\

居中与缩进

居中

环境

\begin{center}第一行\\第二行\\...第n行\end{center}

把由\\命令分开的各节文本居中排列。(可以用\\[长度]来插入可以省略的额外行间距。)如果文本的长度超过一行,那就会用一致的单词间距把它分成几行,除了最后一行外,尽可能地使它充满每一行。不会有断词现象出现。
在一个环境内部,可以用命令\centering来居中后接文本,同样用\\做为行分隔符。声明的作用到该环境结束时为止。
单独一行文本可以把它做为TEX命令\centerline{文本}的参数来居中排列。

单边调整

\begin{flush1eft}第一行\\第二行\\...第n行\end{flushleft}
\begin{flushright}第一行\\第二行\\...第n行\end{flushright}

使得文本向左( flushleft )或向右( flushright )对齐。如果这一段文本在一行中放不下,那就把它断成相同单词间距的几行,这同center 环境一样。而且也不会出现断词。也可以在环境内部用如下的声明达到同样的效果:
\raggedleft代替flushleft环境,而
\raggedright代替flushright环境。

两边缩进

可以用下面的环境来使一段文本的两边都缩进一定的长度:

\begin{quote}     文本 \end{quote}
\begin{quotation} 文本 \end{quotation}

为了与通常的文本区分开,在这段文本的上方和下方插入了额外的间距。
要显示的文本可具有任意的长度;它可以是一句话,也可以是一个段落,甚至于几个段落。
段落与通常一样用空行表示分段,但是在显示文本的开始和结束并不需要空行,因为无论如何这些地方总要插入竖直间距。
上面两种引用环境的区别在于:
在quotation环境中,段落是用第一行具有缩进来标识的,而在quote环境中则是用更多的竖直间距来表的。
只有当通常的文本段落是有第一行进行缩进来标识时quotation环境才具有意义。

诗歌缩进

为了排版诗歌、韵文,需要两边都进行缩进

\begin{verse}诗\end{verse}

列表

要生成有格式的列表,有三种可以使用的环境:

\begin{itemize} 列表文本 \end{itemize}
\begin{enumerate} 列表文本 \end{enumerate}
\begin{description} 列表文本\end{description}

在这些环境中每一个的列表文本都要相对于左边界进行缩进,并且具有一个标签或记号。标签的类型就与所用的环境是什么有关了。生成标签的命令是\item

itemize样例

  • 每一项前面有一个黑点,即所谓的bullet,做为标签。

  • 每一项中的文本可以具有任意长度。标签位于文本的第一行开头处。

  • 相邻项之间具有额外的竖直间距分开。

上述结果是用如下输入生成的:

\begin{itemize}
\item每一项前面有一个黑点,即所谓的\emph{bullet},做为标签。
\item每一项中的文本可以具有任意长度。标签位于文本的第一行开头处。
\item相邻项之间具有额外的竖直间距分开。
\end{itemize}

enumerate样例

  1. 标签由相邻的数字组成。
  2. 每调用一次enumerate环境,标签都是从1开始编号。

上面的例子是由如下输入的文件生成的:

\begin {enumerate}
\item标签由相邻的数字组成。
\item每调用一次\texttt{enumerate}环境,标签都是从1开始编号。
\end{enumerate}

description样例

目的 这个环境适用于定义一组单词或表达式。
例子 关键词做为标签,每一项由分类或解释组成。
其它用途 也可以用于参考文献中的作者列表。

上面的样例是如下生成的:

\begin{description}
\item[目的]这个环境适用于定义一组单词或表达式。
\item[例子]关键词做为标签,每一项由分类或解释组成。
\item[其它用途]也可以用于参考文献中的作者列表。
\end{description}

\item[选项]命令中包含一个可省略的参数,它以黑体形式成为标签。

改变标签样式

itemizeenumerate环境中的标签可以很容易地改变,方法就是利用\item的可省参数。利用\item[+] ,那么标签就变为+ ,而\item[2.1:],标签就成为2.1:。这里可省参数要取代标准标签。对于enumerate环境,这就意味着对应的记数器并没有自动增1,用户必须手工改变它。
可省标签是在专为标签保留的区域中右对齐。该区域的宽度是该层次的缩进总长减去标签与正文的间距;这意味着标签区域的左边界与包围它的外层左边界是对齐的。
可以改变文档中的全部或部分标准标签。在LATEX中是用如下内部命令给itemize生成标签的:

\labelitemi, \lableitemii, \lableitemiii, \labelitemiv

而相应于enumerate的是:

\labelenumi, \labelenumii, \labelenumii, \labelenumiv

这里的i,ii,iii和iv分别指的是四个可能的层次。
可以用\renewcommand来改变这些命令。例如,要把第三层的itemize标签从*改为+,可以用

\renewcommand{\lableitemii}{+}

同样,enumerate环境中的标准标签也可以改变。然而,这里还要复杂一些,因为每个enumerate层次,都还有一个记数器,名字叫enumi, enumii, enumiii和enumiv。一个记数器的值可以用命令\arabic, \roman, \Roman, \alph或\Alph来显示出来,这些命令的意义从名字上就很容易知道了。即\Roman{xyz}用大写罗马数字显示出记数器xyz的当前值,而\alph{xyz}则用的是小写字母(这样a对应于1,z对应于26 )。
这些记数器,同记数器样式命令一起,可以用来重定义标签命令。例如,要把第二层的标签改为阿拉伯数字后加‘.)’,那就需要用

\renewcommand{\labelenunii}{\arabic{enumii}.)}

这样就把\labelenumii重定义为用阿拉伯数字显示的记数器enumii的值,后跟‘)’。用这种方法,所有的层次的编号都可以改变。而且甚至可以包含不只一个记数器:

\renewcommand{\labelenumii}{\Alph{enumi}.\arabic{enumii}}

这样就会使得每当在第二层调用\item ,那就会用作为大写字母的记数器enumi中的值,后跟数字形式的enumii中的值,即形式为: A.1, A.2, …B.1, B.2,…等等。
如果要把新的标准标签适用于整个文档,那就应当把重定义命令放在导言中。否则,它就只对其所出现的那个环境内有效。

参考文献

科技出版物中通常都会包含一长串引用,或者称为参考文献,它由其它工作的名称组成,在正文中通过其活动编号对其进行引用。通常正文没有结束,参考文献也就不会完成。
每当向参考文献中加入-项,如果需要通读所有的正文,以改变所有的。引用编号,那就是一件非常令人头痛的事。因此IATpX提供一种新的机制, 它不但对参考文献进行格式化,而且跟踪对它进行的修改和填加,以在正文中自动改变引用。

参考文献可以用如下环境来生成:

\begin{thebibliography}{标签样本}
所有的参考文献项
\end{thebibliography}

在参考文献中和每一项都是用如下命令开始的:

\bibitem[标签]{关键词}文本条目

如果没有可省参数标签,\bibitem就会生成一个位于中括号内的活动编号,以供在正文中引用。如果想有标签,那你可以用任何东西做标签,如作者姓名的缩写,或者一个随意的引用编号。不可省参数关键词是不会出现在参考文献中的引用关键词,而且将来在正文要被标签取代。关键词可以是字母,数字和除了逗号外的符号组成。
真正的参考文献信息是包含在文本条目中的,其形式可能为‘作者,题目,出版社,年代,版本,页码’,而且不同部分字样可能不同。第一行后的文本要进行缩进,宽度等于标签样本的宽度,因此标签样本应是参考文献中的最长标签。对于活动编号的标准应用,标签样本应该是一个没有意义的数字,但其位数等于最大标签的位数(例如如果有超过10个,但不足100个标签,可以用99 )。
在正文中的引用由如下命令生成:

\cite{关键词}

这里的关键词就是出现在\bibitem命令中的引用关键词。

广义列表

类似于二种环境itemize, enumerate和description这样的列表可以从相当一般的形式构造而来。标签的类型与宽度,缩进的宽度,段落和标签之间的距离等等,都可以由用户通过list环境来全部或部分地进行设置:

\begin{list}{标准标签}{列表声明}列表中的项\end{list}

这里的列表中的项由列表的各项文本组成,每一项由\item命令开头,它要生成相应的标签。
标准标签包含内容是当\item命令没有参数时生成的标签(见后)。
在44.2节中描述的列表参数可以由用户通过列表声明设为任何所期望的值。

标准标签

通常标签中需要包含一列数字。 为此,就必须用\newcounter{名称}命令生成一个新的记数器,这里的名称就是它的标号。这条命令必须位于list环境中对这个记数器第一次应用之前。 假设已为此而定义了一个记数器marker,那么参数标准标签就可以用4.3.5 节中所给出的任一命令来显示记数器:例如,\arabic{marker} 就生成一个活动的阿拉伯数字编号。
即使再复杂的标签也可以用这种方法得到。
一个记数器在标准标签里可以正常使用之前,必须通过在列表声明中包含命令\usecounter{记数器}来把该记数器与列表关联起来,这里的记数器就是赋给记数器的名称(上面例子中的marker )。
标准标签实际上是由\item命令调用\makelabel{标签}得到的。用户可以借助于\renewcommand命令在列表中重定义\makelabel :

\renewcommand{\make1abel}{新的定义}

如果标准标签是以这种方式定义的,在list环境中相应的项左边是空的。这是因为\makelabel是更一般的命令,它覆盖了其它定义。

列表样式参数

有很多样式参数,以格式化列表,LATEX把它们都设置为特定的标准值。在特定的列表中,用户可以在列表声明中改变这些值。用\setlength命令可以像通常那样赋值。然而,如果这种赋值是在list环境外进行的,在大多数情形中,就简单地被忽略了。这是因为在每一层每一个参数都被预设置为默认值,只有列表声明才可以覆盖它。
下面列出了样式参数:

  • \topsep
    是一个竖直距离,其要与\parskip 一起插入到列表与包围它们的上下文本之间。其默认值在每一一个列表层次中进行设置,不能在列表声明外面进行全局重定义。
  • \partopsep
    当第一个\item项前面有空行,或者最后-一个\item项后面有空行时,要把这个量与\topsep + \parskip 一起插入到列表的上面和下面。
  • \parsep
    在一个\item项中段落之间的竖直距离。在每一个层次上设置其默认值,同\topsep有一样。
  • \itemsep
    是一个竖直距离,其与\parsep一起插入到两个 \item 项之间。同\topsep\parsep一样, 其默认值也是在每一个层 次上设置,不能进行全局改变。
  • \leftmargin
    是当前环境的左边界到列表文本左边界的距离。其在每个层次上都有默认值,可以如4.4.6节中描述的那样进行全局重定义。
  • \rightmargin
    是当前环境右边界到列表文本右边界的距离。其标准值为0pt,只可以在列表声明中对其进行改变。
  • \listparindent
    是一个\item项中-段第一行相对于列表文本左边界的缩进宽度。通常设为0pt,因此没有缩进。只可以在列表声明中改变其值。
  • \labelwidth
    是为标签而预留的盒子宽度。在这个空间中,标签是右对齐的。可以为其设置一个全局的默认值,以适用于所用的列表层次。
  • \labelsep
    是标签盒子与列表文本之间的距离。可以全局性地赋给其一个新值,但它只对第一层有作用。
  • \itemindent
    是一个\item项中标签及文本第一行相对于右 边界的缩进宽度。通常取为0pt,因此就没有这种效果。只可以在列表声明中改变其值。

把当竖直距离从其标准值变为其它值,最好使用橡皮长度。
\item命令生成的标签通常在一个宽度为\labelwidth的盒子中是右对齐的。也可以如下面参数列表那样,使其为左对齐的,即在标准标签的定义或者\makelabel命令尾部加上\hfill

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oFBzb1j4-1677896191211)(list参数.png)]

作为新环境的列表

如果在一个文档中要几次使用同一类型的列表,那么在列表环境中输入同样的标准标签和列表声明是一件非常麻烦的事。LATEX提供了一种方法,可以把给定列表定义为具有自己名称的环境。这是用命令\newenvironment来做到的。
例如,可以用名称figlist保存上面例子中的列表,以后可通过该名称
调用它:

\newenvironment{fig1ist}
{
    \begin{list}{\bfseries\upshape Figure \arabic{fig}:}{\usecounter{fig} ... {0ex plus0.2ex}\s1shape}
}
{\end{list}}

这样就可以如下调用它了:

\begin{figlist} 列表项 \end{figlist}

其行为同预定义的列表一样。

平凡列表

在LATEX中还包含一个trivlist环境,其语法为

\begin{trivlist}内部文本\end{trivlist}

在这里没有标准标签列表声明参数。它相当于一个列表,其标签是空的,\leftmargin, \labelwidth和\itemindent都赋值0pt,而\listparindent
等于\parindent\parsep等于\parskip
LATEX用这一环境生成其它环境。 例如,当调用center 环境时,内部实际上调用的就是

\begin{trivlist} \centering \item[] 内部文本\end{trivlist}

环境flushleftflushright也是类似定义的。

嵌套列表

列表也可以与其它的列表环境itemize, enumeratedescription 之间相互嵌套,最大深度为6。在每一层,都要相对于前面高一级那层进行总量为\leftmargin的缩进。
前面已提到过,只有在导言中才可能利用声明改变list参数的有限几个标准值。但有一个例外,那就是不同嵌套层数中左边界的缩进量。在内部它是用参数\leftmargin n n n​​​​来设置的,这里的n表示i, ii, iii, iv, v或vi。用户可以改变这些值;例如,用声明\setlength{\leftmarginiv}{12mm} 可以使得第四层的左边界相对于第三层向右移了12mm。这些声明必须放在list环境外面,也不能放在列表声明里。在嵌套列表的每一层中, 都要调用内部宏\@list n n n​​​(n从i到vi)。它使\leftmargin的值等于相应的\leftmarginn,除非\leftmargin在list环境中显式地进行了声明。也就是说,在外部并不存在单个的\leftmargin标准值,而是6个不同的值。只有在list环境内部,参数\leftmargin才有意义。

定理型的声明

利用命令

\newtheorem{结构类型}{结构标题}[其它记数器]

LATEX就会自动跟踪编号的变化。这里的结构类型是用户给该结构指定的任意一个名称,而结构标题就是那个以黑体字样与活动编号列在一起的单词(如Theorem)。如果没有可省参数其它记数器,在整篇文档中是连续编号的。然而,如果在其它记数器中有一个已存在的记数器的名称,如chapter,每当该记数器增加时,都会对这里的结构重新编号,而且它们可以列在一起,如上面的Axiom 4.1。
预定义的结构可以用如下命令来调用:

\begin{结构类型}[附加标题]文本\end{结构类型}

这里会给必要的记数器增1,以生成恰当的编号。上面的例子就是用如下输入得到的:

\newtheorem{theorem}{Theorem} \newtheorem{axiom}{Axiom}[chapter]
...............................................
\begin{theorem}[Balzano--Weierstrass] Every .... \end{theorem}
\begin{axiom} The natural numbers form ......... \end{theorem}

可以省略的附加标题紧接在活动编号后以黑体字样显示在小括号()内。有时候一个结构的编号并不是与自己有关,它会与其它结构一起编号。为此可以在定义中包含另一个可省参数:

\newtheorem{结构类型}[编号来源]{结构名称}

这里的编号来源是个已存在的定理结构名称,它们共享同个记数器。 因此通过定义\newthoerem{subthrm}[theorem]{Sub-Theorem}theoremsubthrm这两个结构的编号是同一个序列: T h e o r e m 1 , S u b − T h e o r e m 2 , S u b − T h e o r e m 3 , T h e o r e m 4 \rm{ Theorem 1, Sub-Theorem 2,Sub-Theorem 3,Theorem 4 } Theorem1,SubTheorem2,SubTheorem3,Theorem4,依次类推​​。

盒子

所谓盒子,就是一部分文本,TEX把它做一个整体,如同单个字符那样进行处理。一个盒子(连同其中的文本)可以上下左右移动。由于盒子是一个整体,TEX再不能把它分 开,即使最初它是由更小的不可分的盒子组成。然而,如果乐意的话,可以把更小的盒子放在一-起,以构造一一个更大的盒子。
这实际上也就是TEX内部进行格式化时的方法:单个字符构成字符盒子,然后把它放到水平的行盒子中,在单词间插入橡皮长度。行盒子竖直堆积,构成段落盒子,在行之间也要插入橡皮长度。然后把它们放到页面主体盒子中,其连同页眉和页脚盒子一起构成页面盒子。
在LATEX中,用户可以选择三种类型的盒子:LR盒子,段落盒子和标尺盒子。LR(左-右)盒子是由水平的从左到右的有序材料组成。段落盒子则是由竖直堆积的行组成。标尺盒子是一个用黑色填充的实心矩形,通常用来画水平或竖直线。

LR盒子

要创建一个由LR模式中文本组成的盒子,可以用命令

\mbox{文本}  和  \makebox[宽度][位置]{文本}
\fbox{文本}  和  \framebox[宽度][位置]{文本}

左边两条命令生成一个LR盒子,其宽度恰好是在{ }中所给文本的宽度。\fbox 命令同\mbox命令一样,只是文本要用方框包围起来。
而对于右边两条命令,宽度是由可省的长度参数宽度来预先确定的。另一个可省参数位置定义文本在盒子的位置。如果不给任何值,文本是居中排列的。位置参数可以取如下值:

  • l 文本左对齐,
  • r 文本右对齐,
  • s 伸展文本,以达到所定义的宽度。

因此\makebox[3.5cm]{centered text} 生成一个宽度为3.5cm 的盒子,其
中的文本是居中排列的,即centered text, 多余地方是用空白填充的,而\framebox[3.5cm][r]{right justified} 的结果是文本在一个宽度为3.5cm的盒子中右对齐。对于LATEX2e,也可以用

\framebox[3.5cm][s]{stretched\dotfill text}

以生成一个填满的盒子,在这种情形中需要利用橡皮长度或者其它的填充物以填充伸展出现的空白。
如果文本的自然宽度要比所定义的宽度大,那就会视位置参数的不同值,而在盒子的左边、右边或两边突出。
上面这种用法对于\framebox ,确实显得有点儿愚笨,但是对于\makebox却可能非常有用。在picture环境的图示中,可以利用\makebox定义一个宽度为0pt的盒子,这样就可以生成一个居中的,或左(右)对齐的文本。用它也可以使得两部分文本重叠,例如\makebox[0pt][1]{/}S的结果为一-条斜线穿过S。​
注意:长度的定义中必须包含长度单位,即使所定义的长度是零。因此这里定义零宽度必须用0pt,而不能只用0。
在LATEX2ε中也可以相对于一个LR盒子的自然宽度(即只用命令\mbox时的宽度)来定义其宽度:

  • \width
    表示盒子的自然宽度,
  • \height
    表示从基线到顶部的距离,
  • \depth
    表示从基线到底部的距离,
  • \totalheight
    就是\height加上\depth。

要生成一个宽度为其中包含文木的总高度六倍的有框盒子,可以用命令:

\framebox[6\totalheight]{Text}

注意:这些特殊的长度参数只在一个LR盒子的宽度定义或者下面将要介绍的段落盒子的高度定义中才有意义。而出现在其它情形中,就会产生错误信息。
如果一部分文本要出现在文档的几个地方,那么可以把它们保存起来, 首先用如下命令:

newsavebox{\boxname}

这样就可以创建一个叫‘\boxname'的盒子。该名称要符合LATEX命令语法(只
能有字母),并且前面有\。其也不能与任何已存在的LATEX命令同名。一旦已经如此初始化了一个盒子,那么命令:

\sbox{\boxname}{文本}或者
\savebox{\boxname}[宽度][位置]{文本}

就会把文本的内容保存起来,以备后面使用。这里的可以省略参数宽度和位置与\makebox\framebox中的意义一样。接着就可以在需要时用命令

\usebox{\boxname}

来把保存的文本当做一个整体插入文档中。
LR盒子的内容也可以用如下环境来保存:

\begin{1rbox}{boxname}
文本
\end{1rbox}

其等价于\sbox{\boxname}{文本}。其好处在于它可以保存位于用户定义的环境中的文本,以备将来用\usebox插入。

LR盒子的竖直位置

命令

\raisebox{上移量}[高度][深度]{文本}

生成一一个内容为文本的\mbox,它相对于当前基线向上移动了上移量。可省参数告诉LATEX该盒子在基线上方伸展的高度,基线以下的深度。若没有这些参数值,盒子具有由文本和上移量确定的自然尺寸。注意这里的上移量高度深度都是长度。如果上移量为负数,那么盒子就相对于基线向下移动。
高度深度的值可以与文本的实际值完全不同。其结果是根据同一行上所有其它盒子(字符也是盒子)的高度和深度,来确定当前文本行与前后文本行的距离。当提升了一个盒子,而高度却是正常的字符大小,那么被提升的盒子就会与上面的文本行重叠,同样当降低一个盒子时深度也具有同样的效果。

子段盒子和小页

整个段落可以用如下命令来放到单独的竖直盒子(或者套用LATEX术语称为子段盒子)中:

\parbox[位置]{宽度}{文本}

也可以用环境实现同样的效果:

\begin{minipage}[位置]{宽度}文本\end{minipage}

其都生成一个给定宽度的竖直盒子,其中的文本行如通常段落模式一样彼此堆积,宽度可取数\长度,如0.4\linewidth,表示 0.4 × l i n e w i d t h 0.4\times linewidth 0.4×linewidth

可省的参数位置有可取如下值:

  • b : 盒子的底边与当前基线对齐,
  • t : 顶行文本与当前基线对齐。

当没有任何位置参数时,子段盒子相对于外部文本的基线竖直居中排列。
位置参数只有当\parbox命令或者minipage环境位于一个段落内部时才有意义,否则当前行与基线都没有意义。如果子段盒子前面紧接一个空行,这就是要开始一个新段。在这种情形中,子段盒子的竖直位置是由段落中后面的元素确定的。而后面的元素也可以还是子段盒子。如果整个段落只是由一个子段盒子或者小页组成,位置参数也没有意义,是无效的。

\parbox命令生成一个由文本组成的竖直盒子,这同minipage环境是一样的。但是后者更具有一般性。在\parbox中的文本不可以包含居中、列表或者其它环境。而另一方面,在minipage环境中是完全可以包含这些环境的。也就是说,一个minipage可以包含居中或缩进文本,也可以有列表和制表。

具有指定高度的段落盒子

在LATEX2e中,\parbox命令和minipage环境的语法已进行了推广,可以还有两个可省参数:

\parbox[位置][高度][内部位置]{宽度}{文本}
\begin{minipage}[位置][高度][内部位置]{宽度}
文本
\end{minipage}

在这两种情形中,高度定义盒子的高度;在高度参数中,可以同\makebox\framebox中的宽度参数一样,使用\height, \width, \depth和\totalheight参数。
可省参数内部位置说明文本在内部是如何定位的,其只有当给定了高度时才有意义。可能的取值为

  • t 文本靠盒子的顶部,
  • b 把文本推向盒子的底部,
  • c 竖直居中,
  • s 伸展文本以填满整个盒子。

在最后那种情形中,当出现竖直伸展时,要用到橡皮长度。
注意外部定位参数位置与内部定位参数内部位置的区别:前者说的是盒子如何与包围它的文本对齐,而后者决定在盒子中的内容是如何安排的。

标尺盒子

所谓标尺盒子就是完全用黑色填充的矩形。其相应命令的一般语法为

\rule[提升]{宽度}{高度}

其生成一个具有给定宽度高度的实心盒子,并且相对于基线向上做提升。 若没有可省参数提升,矩形就放在当前文本行的基线上。
参数提升,宽度和高度都是长度。如果提升为负数,则矩
形位于基线以下。
也可以生成一个宽度为零的标尺。这样就得到一个不可见的具有给定高度的盒子。如此的构造称为一个支撑,这样可以强迫其所在的水平盒子具有不同于其所包含内容需要的高度和深度。对于这种情形,用\vspace就行不通,因为它只是增加已经存在的竖直间距。
例如,\fbox{Text}的结果为 Text \fbox{Text} Text​​。为了得到KaTeX parse error: Can't use function '\rule' in text mode at position 7: \fbox{\̲r̲u̲l̲e̲[-1.5mm]{0cm}{6…​​​​​,那就必须告诉TEX,盒子中的内容要相对于基线向上和向下延伸一定的长度。这可以用
\fbox{\rule[-1.5mm]{0cm}{6mm}Text}来实现。这也就是说要用方框包围起来的文本是‘一个不可见的柱子,其底位于基线下1.5mm ,高有6mm ,它后面接
单词Text’。这个竖直条虽然看不到,但它却可以确定方框的顶边和底边。标尺盒子的高度也可以是零,这就是一个不可见的具有给定宽度的水平线;然而,这种构造应是没有什么实际作用的,因为可以用\hspace命令很容易得到水平位移。

嵌套盒子

每个盒子都是一个整体,TEX把它们当做具有相应尺寸的单个字符一样来处理,那么一切就很清楚了。

把子段盒子包围在\raisebox内,可以得到任意希望的竖直位移。这里的两个盒子都具有位置参数[b],而右边的那个是如下生成的:
一个很有用的结构就是在一个minipage环境中,两个minipage环境相互定位。外层minipage的位置参数可以用来把其内容做为一个整体, 与相邻文本或者盒子对齐。
最后提一下,类似\parbox命令和minipage环境这样的竖直盒子也可以做为\sbox或者\savebox命令中的文本,从而保存起来,以后可以通过\usebox调用它们。

盒子样式参数

对于有框盒子\fbox\framebox,有两个用户可以重设的样式参数:

  • \fboxrule确定方框线的粗细,
  • \fboxsep设置方框与被包围文本之间的距离大小。

与通常的LATEX方式一样,用\setlength命令可给这些长度参数赋新值:利
用命令\setlength{\fboxrule}{0.5mm} ,可以使得所有后面的\framebox\fbox命令中的线粗都为0.5mm。
这些设置的适用范围也遵从通常的规则;如果其位于导言中,那么其适用于整个文档;如果它位于一个环境中,那么其有效性持续到环境结束。这些参数对于用在picture环境中的\framebox命令没有作用。因为那里面的\framebox命令的语法和作用要比通常时候的更加广泛。

表格

构造表格

环境tabular, tabular*array是生成表格和矩阵的基本工具。这些
环境的语法如下:

\begin{array}[位置]{列}
行
\end{array}

\begin{tabular}[位置]{列}
行
\end{tabular}

\begin{tabular*}{宽度}[位置]{列}
行
\end{tabular*}

array环境只能用在数学模式中。只所以在这里提及它,就是因为它的语法和参数意义与tabular环境中的完全一样。 这三种环境都创建一个小页。参数意义如下:

  • 位置
    竖直定位参数(也可以看子段盒子中同名参数的意义)。它可以取下列值:

    • t 表格顶部与当前外部文本行的基线对齐;
    • b 表格底部与外部基线对齐;
      当没有定位参数时,表格相对于外部基线居中摆放。
  • 宽度
    该参数只能出现在tabular*环境中,其确定它的整体宽度。在这种情形中,参数必须在第一项后面某 个地方包含@-表达式(细节见下)@{\extracolsep{\fill}}。对于其它两种环境,整体宽度是由其文本内容确定的。


  • 列格式参数。除了可能存在的相应于表格左右边界和列间距的额外项外,每列都必须在其中有一个相应的项。

    ​ 可能的列格式符号有

    • l 列内容是左对齐的;

    • r 列内容是右对齐的;

    • c 列内容是居中的;

    • p{宽} 将该列的文本设置成具有给定的行,顶行与其它列对齐。实际上文本是用命令\parbox[t]{宽}{列文本}放在一个子段盒子中的;

    • *{数}{列} 包含在中的列格式被复制了份,因此*{5}{|c}|的结
      果与|c|c|c|c|c|相同。

      相应于左右边界和列间距的可用格式化符号有:

    • | 画一条竖直线

    • || 画两条紧相邻的竖线

    • @{文本} 这一条也叫做@-表达式,它在自己出现的两列中间每一行上插入文本

      @-表达式去掉了原本自动加在两列之间的空白。如果在插入文本和后面的列之间需要有空白,那么需要在@-表达式的文本中包含\hspace{}命令。如果想使某两个特定列之间的距离与其它的标准间距有所不同,那么可以通过在格式参数中对应于这两列的地方放上@{\hspace{宽}},这样就可能很容易地达到目标了。这里给定宽度的空白取代了标准列间距。
      ​ 在@-表达式中的\extracolsep{宽}会使得所有后面的列间距都增加给定宽度的额外间距,其作用持续到下一个\extracolsep为止。与标准间距不同,后面的@-表达式并不会去掉这个额外空白。在tabular*环境中,在列格式中的某处必须有@{\extracolsep\fill}命令,以使得后面所有列间距可以伸展到预定义的表格宽度。
      ​ 如果表格的左右边界并没有竖线,那么就会在该处加入等于通常列间距一半的空白。如果不希望加入这个空白,可以在列格式的开始或结尾处包含一个空的@-表达式@{},以删掉这种空白。


  • 由表格的实际条目组成,每一水平行都由\\结束。这些行是由一组彼此之间用&符号分开的列条目组成。因此每一行应具有与在列定义中相同数目的列条目。可以有些条目是空白的。TEX把每个列条目当做就好像用大括号{ }包围起来一样,因此对于类型样式或尺寸的修改,将被局限在这个列中。

    • \hline 这条命令只能位于第一行前面,或者紧接在行结束符\\后面。它在刚结束的那行下面画一条水平直线, 或者如果其位于开头时,在表格顶部画一横线,横线的宽度与表格的宽度相同。
      放在一起的两条\hline命令就会画出两条间隔很小的水平线。

    • \cline{n-m} 该命令从第n列的左边开始,画一条到第 m列右边结束的
      水平线。与\hline一样,它也只能位于行结束符\\的后面,而且可以同时有多次。命令\cline{1-3} \c1ine{5-7}就会在刚结束的行下面画两条水平线,一条是从第1列到第3列,另一条是从第5列到第7列。在每种情形下,用的都是完全列宽。

    • \multicolumn{数}{列}{文本} 该命令把接下来的列组合成单个列,其宽度等于总宽度加上列间距。参数由一个定位参数l,r或c,以及可能有的@-表达式和竖线组成。通过把的值取1,可以改变特定行中某一 列的定位参数。

      ​ 在这种情况下,‘列’ 是由定位符号l,r或c开始的,包含所有接下来的内容,直到遇到另一个定位符号为止。第一列也可以包含在第一个定位符号之前的内容。因此|c@{}rl|就包含三列:第一列是|c@{},第二列是r,第三列是r|

      \multicom命令只能位于一行的开始或者一个列分隔符&后面。

    • \vline 该命令画一条竖直线,其高度等于其所位于地方的行高。用这种
      方法,可以得到那些不是贯穿整个表格的竖直线。

对于tabulararray环境,也可以用LATEX2ε命令\tabularnewline结束一行。这是一条明确的行结束符,而\\可以在一个列条目中结束一个文本行。
由于表格是与子段盒子和小页一样的竖直盒子,因此它也可以与其它的盒子或者文本水平定位。特别要指出的是,为了使表格在页面上居中表格必须包围在

\begin{center}表格\end{center}

表格样式参数

在表格的生成中,LATEX要利用许多样式参数,来设置其标准值。用户也可以改变这些值,既可以在导言中进行全局性改动,也可以只局限于一个环境中。但不能在表格内部对其进行改动。

\tabcolsep 是插入在tabular和tabular*环境中两列间距离的一半;
\arraycolsep 是在array环境中相应于列间距的一半;
\arrayrulewidth 是表格中水平线与竖直线的粗细;
\doublerulesep 是双直线时两线之间的距离。

可以用\setlength命令像通常那样改变这些参数的值。例如,利用命令\setlength{\arrayrulewidth}{0.5mm}可使直线粗变为0.5mm。除了上面
的参数外,还有参数

\arraystrecth 可以用来修改表格中的行间距。这是一个放缩因子,标准值为1。取值1.5就意味着行间距增大50%。

可以用如下命令来重定义该参数:

\renewcommand{\arraystrecth}{因子}

浮动表格

tabular环境是在其所出现的地方生成一个表格,紧接其前面的文本,后面就是跟着它的其它内容。当在页面上表格与周围文本匹配得很好时,这没有什么问题,而且这通常也说是我们想要的。然而,如果表格很长,从它定义的地方开始,在一页中是放不卜来的,那么就会结束该页,下一贞开头就是这个表格,后面再接后续文本。这样就会导致当前页的格式并不是希望看到的样子。
如果在当前页上表格出现的地方有足够空间放下这个表格,那么就把它马上放下,否则就继续排版文本,保留表格到当有足够空间时,如下一页的开头,再排版表格,这种方式就是很好的。因于表格通常有标题和/或题目,这些项也自然应该随着它一起移动。
LATEX提供了浮动表格(还有插图)的功能,其附加文本也以同样方式移动。这可以用如下环境来实现此功能:

\begin{table}上部文本  表格  下方文本\end{tab1e}

这里的·代表诸如tabular环境定义的整个表格,上部文本表示出现在表格上方的文本,而下方文本表示出现在表格下方的文本。与表格相关联文本的宽度、间距和位置都要由用户来安排。
出现在\begin{table}\end{table}中的所有内容是与包围它的外部文本无关,它们通常都放在当前页的开头。如果已有-一个表格占用了这个位置,那就会尝试是否可能有足够的空间,把它放在当前页的底部。否则,就会把它放在下一页上,这样就有可能积累很多表格。包围表格的文本就如同没有表格那样进行排版。关于浮动的一般性细节,以及自动有序编号。

脚注和边注

标准脚注

脚注是用如下命令生成的:

\footnote{脚注文本}

该命令紧接在需要在脚注中进行解释的单词后面。脚注文本用较小的字样以脚注的形式显示在当前页的底部。脚注的第一行要进行缩进, 并给出与正文插入点处相同的脚注标记。在一页上的第一-个脚注是用一条短水平线与正文分开的。
标准脚注标记是一个小的偏上的数字1,它是顺序编号的。

在article类中,整个文档统一对脚注进行编号, 而在report和book类中,每当开始新的一章时其都会重置为1。
\footnote脚注只可以位于通常的段落模式中,不能位于数学模式或LR模式中。实际上,这就意味着它不能位于一个LR盒子或者子段盒子中。然而,它却可以用在minipage环境中,此时脚注文本显示在小页的下面,而不是实际页面的底部。
\footnote命令必须紧接在接受这个注释的单词后面,中间不必有任何空格或间隔。一句话的脚注可以在句号后面给出。

非标准脚注

如果用户希望在article类中每当开始新的一节时, 脚注编号重置为1,那可以用如下命令:

\setcounter{footnote}{0}

就把这条命令放在\section命令的前面或后面。
内部脚注记数器的名称为footnote。每次调用\footnote都会使这个记数器值增1,并以阿拉伯数字形式显示出新值做为脚注的标记。可以用如下命令来实现不同样式的标记:

\renewcommand{\thefootnote}{\数字样式{footnote}}

这里的数字样式就是一个记数器显示命令: \arabic,\roman, \Roman, \alph或\Alph。然而,对于footnote记数器,还有另一个记数器显示命令可以使用,它就是\fnsymbol
这里需要用户在调用第十个\footnote命令之前把脚注记数器重值为零。
\footnote命令中还可以有一个可省参数:

\footnote[数]{脚注文本}

这里的数是一个正数,要用它来取代显示标记的脚注记数器的值。在这种情形中,脚注记数器的值并没有增加。

小页环境中的脚注

在小页环境中可以用脚注命令。然而脚注是显示在小页的下面,而不是当前页的底部。

在表格即tabular环境中的脚注通常只能用上面所描述的命令得到:\footnotemark在表格内部,\footnotetext在环境外面。然而如果tabular
环境是在一个小页环境内部,通常的\footnote命令也可以在表格内部使用。脚注显示在小页结束时的表格下方。

脚注样式参数

有两个脚注样式参数可以在需要时进行修改,这种修改既可以在导言中进行,也可以在一个环境中进行。

  • \footnotesep
    两个脚注间的竖直距离。可以用\setlength命令修改这个长度。

  • \footnoterule
    这条命令在正文与脚注之间画一条水平线。它并不会增加任何竖直间
    距。可以修改它的定义,例如,

    \renewcommand{\footnoterule}{\rule{宽度}{高度}\vspace{-高度}}
    

    高度的值为零时就会生成一个零高度的不可见直线。

边注

在页边上的注释可以用下面的命令生成:

\marginpar{注释文本}

它把注释文本放在右面的页边上,开始点与命令所在行相平。

另一种使用需要使用边注的地方就是在要引起注意的文本旁边画一条竖线。这有时用来表示相对于以前的版本,这部分文本进行了改动。本段中的标记样例就是在第一行中用如下输入得到的:

\begin{marginpar}{\rule[-17.5mm]{1mm}{20mm}}

在默认状态下,边注出现在一页的右边, 或者当选定了twoside选项时的外页边。这里的‘外’指的是奇数页的右页边,偶数页的左页边。当用了twocolumn
选项时,它们就被放在外面的边界上;左列的左边,右列的右边。
但这样做有时会使类似上面给出的箭头这样的页边记号出现问题。如果该须为偶数页,它就必须指向相反的方向。事实上,它的方向是与它位于页的哪一边有关, 也就是依赖于页码和列。由于在书写(或者后来对它进行修改)时并不知道它指向它哪个方向。这可以用\marginpar命令的扩充语法来实现这一点:

\marginpar[左文本]{右文本}

这种形式的命令包含页边文本的两个版本,左文本会出现在左边,右文本会在出现在右边,具体视需要哪个而定。因此为了全面起见,排版上面那个箭头的边注命令应该是

\marginpar[\hfi11$\Longrightarrow$]{$\Long1eftarrow$}

在上面的\marginpar例子中若没有用\hfill命令,那么位于左边界上的箭头就会显示在其所在段的左边,从而离正文很远。之所以会这样,是因为\marginpar命令把它的内容左对齐处理,在下一页上的一个有框边注就很好地说明了这一点:靠左边对齐正文的方式只适用于边注位于右边界的情形;如果它位于左边界,就会离正文太远。\hfill命令就是为了使得边注内容向右边对齐,从而使得它处在相对于正文比较恰当的位置上。
对于这一节第一个边注,也需要用同样的方法来处理。实际生成它的命令是

\marginpar [\flushright这是\\一个\\边注]{这是\\一个\\边注}

这里的\flushright就等价于在每一行,上放一个\hfill

边注的标准位置可以用\reversemarginpar命令来进行变换。一旦使用了这个命令,边注就会位于左边,或者在\twoside选项时出现在内边界。这个命令的作用直到出现相反命令\normalmarginpar为止。对于twocolumn命令,这两个命令没有作用。
在边注中不能进行分页。如果一个边注太靠近页面底部,从而没有足够空间放下它,那边注就会延伸到最后一行的下面。在这种情形中,\marginpar命令中的文本开头应包含一个\vspace命令,以使得边注向上移动一点儿,或者就用两条\marginpar命令把它分成两部分,分放在不同的页上。这种手工调整只有在整篇文档完成后才能进行,因为以后对文档进行改动就会使情形发生变化。

边注的样式参数

可以改动下面的样式参数,以重定义边注的显示方式:

  • \marginparwidth
    定义边注盒子的宽度;
  • \marginparsep
    设置边注盒子与正文边界之间的距离;
  • \marginparpush
    两个边注盒子之间的最小竖直距离。

这些参数都是长度,可以用\setlength命令像通常那样赋予一个新值。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
PyOpenGL是一个实现OpenGL图形库的Python绑定库。要在PyOpenGL中显示文本,您可以使用Pygame或Pillow库来创建渲染文本的图像,然后使用OpenGL的纹理映射来将其绘制到屏幕上。 以下是一个显示文本的示例程序: ```python import pygame from OpenGL.GL import * from OpenGL.GLU import * from PIL import Image, ImageFont, ImageDraw # 初始化Pygame pygame.init() size = (640, 480) pygame.display.set_mode(size, pygame.DOUBLEBUF | pygame.OPENGL) # 初始化OpenGL glViewport(0, 0, size[0], size[1]) glMatrixMode(GL_PROJECTION) glLoadIdentity() gluOrtho2D(0, size[0], 0, size[1]) glMatrixMode(GL_MODELVIEW) # 创建文本图像 text = "Hello, world!" font = ImageFont.truetype("arial.ttf", 32) img = Image.new("RGBA", size, (255, 255, 255, 0)) draw = ImageDraw.Draw(img) draw.text((size[0] / 2, size[1] / 2), text, font=font, fill=(255, 255, 255, 255)) # 转换图像为OpenGL纹理 data = img.tobytes("raw", "RGBA", 0, -1) tex_id = glGenTextures(1) glBindTexture(GL_TEXTURE_2D, tex_id) glPixelStorei(GL_UNPACK_ALIGNMENT, 1) glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, size[0], size[1], 0, GL_RGBA, GL_UNSIGNED_BYTE, data) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR) # 渲染文本 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) glLoadIdentity() glEnable(GL_TEXTURE_2D) glBindTexture(GL_TEXTURE_2D, tex_id) glBegin(GL_QUADS) glTexCoord2f(0, 0) glVertex2f(0, 0) glTexCoord2f(1, 0) glVertex2f(size[0], 0) glTexCoord2f(1, 1) glVertex2f(size[0], size[1]) glTexCoord2f(0, 1) glVertex2f(0, size[1]) glEnd() glDisable(GL_TEXTURE_2D) # 刷新窗口 pygame.display.flip() # 循环渲染 while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() quit() ``` 此程序使用Pygame库创建一个窗口,并使用OpenGL绘制了一个包含“Hello, world!”文本的纹理。程序还使用Pillow库创建了一个包含文本图像的Image对象,并将其转换为OpenGL纹理。最后,程序在OpenGL上下文中渲染出文本纹理,并使用Pygame显示到屏幕上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Shilong Wang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值