03_LaTeX之文档元素

news/2025/1/15 19:56:42/文章来源:https://www.cnblogs.com/Invinc-Z/p/18673652

目录
  • 03_\(\LaTeX{}\) 之文档元素
    • 章节和目录
      • 章节标题
      • 目录
      • 文档结构的划分
    • 标题页
    • 交叉引用
    • 脚注和边注
    • 特殊环境
      • 列表
      • 对齐环境
      • 引用环境
      • 摘要环境
      • 代码环境
    • 表格
      • 列格式
      • 列宽
      • 横线
      • 合并单元格
      • 嵌套表格
      • 行距控制
    • 图片
    • 盒子
      • 水平盒子
      • 带框的水平盒子
      • 垂直盒子
      • 标尺盒子
    • 浮动体
      • 浮动体的标题
      • 并排和子图表
    • 参考文献

03_\(\LaTeX{}\) 之文档元素

本文主体内容来自一份 (不太) 简短的 LATEX2ε 介绍。

在知道了如何输入文字后,在本章了解一个结构化的文档所依赖的各种元素——章节、目录、列表、图表、交叉引用、脚注等等。

章节和目录

章节标题

一篇结构化的、条理清晰文档一定是层次分明的,通过不同的命令分割为章、节、小节。三个标准文档类 articlereportbook 提供了划分章节的命令:

\chapter{⟨title⟩} \section{⟨title⟩} \subsection{⟨title⟩}
\subsubsection{⟨title⟩} \paragraph{⟨title⟩} \subparagraph{⟨title⟩}

其中 \chapter 只在 reportbook 文档类有定义。这些命令生成章节标题,并能够自动编号。除此之外 \(\LaTeX{}\) 还提供了 \part 命令,用来将整个文档分割为大的分块,但不影响 \chapter\section 等的编号。

上述命令除了生成带编号的标题之外,还向目录中添加条目,并影响页眉页脚的内容。每个命令有两种变体:

  • 带可选参数的变体:\section[<short title>]{<title>}

    标题使用 参数,在目录和页眉页脚中使用 <short title> 参数;</p> </li> <li> <p>带星号的变体:<code>\section*{<title>}</code><br> 标题不带编号,也不生成目录项和页眉页脚。</p> </li> </ul> <p>较低层次如 <code>\paragraph</code> 和 <code>\subparagraph</code> 即使不用带星号的变体,生成的标题默认也不带编号,事实上,除 <code>\part</code> 外:</p> <ul> <li><code>article</code> 文档类带编号的层级为 <code>\section</code>、<code>\subsection</code>、<code>\subsubsection</code> 三级;</li> <li><code>report</code> 和 <code>book</code> 文档类带编号的层级为 <code>\chapter</code>、<code>\section</code>、<code>\subsection</code> 三级。</li> </ul> <h3 id="目录">目录</h3> <p>生成目录非常容易,只需在合适的地方使用命令:<code>\tableofcontents</code></p> <p>这个命令会生成单独的一章(<code>report</code>/<code>book</code>)或一节(<code>article</code>),标题默认为“Contents”,可定制标题。这种生成的章节默认不写入目录(<code>\section*</code> 或 <code>\chapter*</code>),可使用 <code>tocbibind</code> 等宏包修改设置。</p> <p>正确生成目录项,一般需要 <strong>编译两次源代码</strong>。</p> <p>有时使用了 <code>\chapter*</code> 或 <code>\section*</code> 这样不生成目录项的章节标题命令,而又想手动生成该章节的目录项,可以在标题命令后面使用:</p> <p><code>\addcontentsline{toc}{<level>}{<title>}</code></p> <p>其中 <level> 为章节层次 <span class="math inline">\(\texttt{chapter}\)</span> 或 <span class="math inline">\(\texttt{section}\)</span> 等,<title> 为出现于目录项的章节标题。</p> <p><code>titletoc</code>、<code>tocloft</code> 等宏包提供了具体定制目录项格式的功能,详情请参考宏包的帮助文档。</p> <h3 id="文档结构的划分">文档结构的划分</h3> <p>所有标准文档类都提供了一个 <code>\appendix</code> 命令将正文和附录分开,使用 <code>\appendix</code> 后,最高一级章节改为使用拉丁字母编号,从 A 开始。</p> <p><code>book</code> 文档类还提供了前言、正文、后记结构的划分命令:</p> <ul> <li><code>\frontmatter</code> 前言部分,页码使用小写罗马数字;其后的 <code>\chapter</code> 不编号。</li> <li><code>\mainmatter</code> 正文部分,页码使用阿拉伯数字,从 1 开始计数;其后的章节编号正常。</li> <li><code>\backmatter</code> 后记部分,页码格式不变,继续正常计数;其后的 <code>\chapter</code> 不编号。</li> </ul> <p>以上三个命令还可和 <code>\appendix</code> 命令结合,生成有前言、正文、附录、后记四部分的文档。</p> <p>下面的源代码是一份完整的文档结构。</p> <pre><code class="language-tex">\documentclass{book} % 导言区,加载宏包和各项设置,包括参考文献、索引等 \usepackage{makeidx} % 调用 makeidx 宏包,用来处理索引 \makeindex % 开启索引的收集 \bibliographystyle{plain} % 指定参考文献样式为 plain\title{Languages} \author{someone}\begin{document}\frontmatter % 前言部分 \maketitle % 标题页 \include{preface} % 前言章节 preface.tex \tableofcontents\mainmatter % 正文部分 \include{chapter1} % 第一章 chapter1.tex \include{chapter2} % 第二章 chapter2.tex ... \appendix % 附录 \include{appendixA} % 附录 A appendixA.tex ...\backmatter % 后记部分 \include{epilogue} % 后记 epilogue.tex \bibliography{books} % 利用 BibTeX 工具从数据库文件 books.bib 生成参考文献 \printindex % 利用 makeindex 工具生成索引\end{document} </code></pre> <h2 id="标题页">标题页</h2> <p><span class="math inline">\(\LaTeX{}\)</span> 支持生成简单的标题页。首先需要给定标题和作者等信息:</p> <p><code>\title{<title>}</code> <code>\author{<author>}</code> <code>\date{<date>}</code></p> <p>其中前两个命令是必须的(不用 <code>\title</code> 会报错;不用 <code>\author</code> 会警告),<code>\date</code> 命令可选。<span class="math inline">\(\LaTeX{}\)</span> 还提供了一个 <code>\today</code> 命令自动生成当前日期,<code>\date</code> 默认使用 <code>today</code>。在 <code>\title</code>、<code>\author</code> 等命令内可以使用 <code>\thanks</code> 命令生成标题页的脚注,用 <code>\and</code> 隔开多个人名。</p> <p>在信息给定后,就可以使用 <code>\maketitle</code> 命令生成一个简单的标题页了。下面的源代码给出了一个标题页的示例和大致效果。</p> <p><span class="math inline">\(\texttt{article}\)</span> 文档类的标题默认不单独成页,而 <span class="math inline">\(\texttt{report}\)</span> 和 <span class="math inline">\(\texttt{book}\)</span> 默认单独成页。可在 <code>\documentclass</code> 命令调用文档类时指定 <span class="math inline">\(\texttt{titlepage}\)</span> 或 <span class="math inline">\(\texttt{notitlepage}\)</span> 选项以修改默认的行为。</p> <pre><code class="language-tex">\title{Test title} \author{ Mary\thanks{E-mail:*****@***.com}\and Ted\thanks{Corresponding author}\and Louis} \date{\today} </code></pre> <img src="https://zzz-drawing-bed.oss-cn-nanjing.aliyuncs.com/img/image-20250114201008937.png" alt="image-20250114201008937" style="zoom:67%;" /> <p><span class="math inline">\(\LaTeX{}\)</span> 标准类还提供了一个简单的 <code>titlepage</code> 环境,生成不带页眉页脚的一页。用户可以在这个环境中使用各种排版元素自由发挥,生成自定义的标题页以替代 <code>\maketitle</code> 命令。甚至可以利用 <code>titlepage</code> 环境重新定义 <code>\maketitle</code>:</p> <pre><code class="language-tex">\renewcommand{\maketitle}{\begin{titlepage} ... % 用户自定义命令 \end{titlepage}} </code></pre> <p>事实上,为标准文档类指定了 <span class="math inline">\(\texttt{titlepage}\)</span> 选项以后,使用 <code>\maketitle</code> 命令生成的标题页就是一个 <span class="math inline">\(\texttt{titlepage}\)</span> 环境。</p> <p>以上是 <span class="math inline">\(\LaTeX{}\)</span> 标准文档类的标题页相关命令用法。在各种文档模板中经常有自定义的标题页,有可能需要除了 <code>\title</code> 和 <code>\author</code> 以外的命令给定信息,用法也可能与标准文档类的不一致(甚至有些模板可能没有定义 <span class="math inline">\(\texttt{titlepage}\)</span> 等环境)。</p> <p><mark><strong>使用文档模板前一定要仔细阅读文档模板的帮助文档。</strong></mark></p> <h2 id="交叉引用">交叉引用</h2> <p>交叉引用是 <span class="math inline">\(\LaTeX{}\)</span> 强大的自动排版功能的体现之一。在能够被交叉引用的地方,如章节、公式、图表、定理等位置使用 <code>\label</code> 命令:</p> <pre><code class="language-tex">\label{<label-name>} </code></pre> <p>之后可以在别处使用 <code>\ref</code> 或 <code>\pageref</code> 命令,分别生成交叉引用的编号和页码:</p> <pre><code class="language-tex">\ref{<label-name>} \pageref{<label-name>} </code></pre> <img src="https://zzz-drawing-bed.oss-cn-nanjing.aliyuncs.com/img/image-20250114202135903.png" alt="image-20250114202135903" style="zoom:67%;" /> <p>为了生成正确的交叉引用,一般也需要 <strong>多次编译源代码</strong>。</p> <p><code>label</code> 命令可用于记录各种类型的交叉引用,使用位置分别为:</p> <ul> <li><strong>章节标题</strong> 在章节标题命令 <code>\section</code> 等之后紧接着使用。</li> <li><strong>行间公式</strong> 单行公式在公式内任意位置使用;多行公式在每一行公式的任意位置使用。</li> <li><strong>有序列表</strong> 在 <span class="math inline">\(\texttt{enumerate}\)</span> 环境的每个 <code>\item</code> 命令之后、下一个 <code>\item</code> 命令之前任意位置使用。</li> <li><strong>图表标题</strong> 在图表标题命令 <code>\caption</code> 之后紧接着使用。</li> <li><strong>定理环境</strong> 在定理环境内部任意位置使用。</li> </ul> <p>在使用不记编号的命令形式(<code>\section*</code>、<code>\caption*</code>、带可选参数的 <code>\item</code> 命令等)时不要使用 <code>\label</code> 命令,否则生成的引用编号不正确。</p> <h2 id="脚注和边注">脚注和边注</h2> <p>使用 <code>\footnote</code> 命令可以在页面底部生成一个脚注。假如输入以下文字和命令:</p> <blockquote> <p>“天地玄黄,宇宙洪荒。日月盈昃,辰宿列张。”\footnote</p> </blockquote> <p>在正文中则为:“天地玄黄,宇宙洪荒。日月盈昃,辰宿列张。”<sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup></p> <p>有些情况下(比如在表格环境、各种盒子内)使用 <code>\footnote</code> 并不能正确生成脚注。可以分两步进行,先使用 <code>\footnotemark</code> 为脚注计数,再在合适的位置用 <code>\footnotetext</code> 生成脚注。比如:</p> <pre><code class="language-tex">\begin{tabular}{l} \hline “天地玄黄,宇宙洪荒。日月盈昃,辰宿列张。”\footnotemark \\ \hline \end{tabular} \footnotetext{表格里的名句出自《千字文》。} </code></pre> <img src="https://zzz-drawing-bed.oss-cn-nanjing.aliyuncs.com/img/image-20250114210530107.png" alt="image-20250114210530107" style="zoom:67%;" /> <p>使用 <code>\marginpar</code> 命令可在边栏位置生成边注:</p> <pre><code class="language-tex">\marginpar[⟨left-margin⟩]{⟨right-margin⟩} </code></pre> <p>如果只给定了 right-margin,那么边注在奇偶数页文字相同;如果同时给定了 left-margin,则偶数页使用 left-margin 的文字。</p> <img src="https://zzz-drawing-bed.oss-cn-nanjing.aliyuncs.com/img/image-20250114211653969.png" alt="image-20250114211653969" style="zoom:67%;" /> <h2 id="特殊环境">特殊环境</h2> <h3 id="列表">列表</h3> <p><span class="math inline">\(\LaTeX{}\)</span> 提供了基本的有序和无序列表环境 <span class="math inline">\(\texttt{enumerate}\)</span> 和 <span class="math inline">\(\texttt{itemize}\)</span>,两者用法类似,都用 <code>\item</code> 标明每个列表项。<span class="math inline">\(\texttt{enumerate}\)</span> 环境会自动对列表项编号。</p> <pre><code class="language-tex">\begin{enumerate} \item … \end{enumerate} </code></pre> <p>其中 <code>\item</code> 可带一个可选参数,将有序列表的计数或者无序列表的符号替换成自定义的符号。列表可以嵌套使用,最多嵌套四层。</p> <pre><code class="language-tex">\begin{enumerate}\item An item.\begin{enumerate}\item A nested item.\label{itref}\item[*] A starred item.\end{enumerate}\item Reference(\ref{itref}). \end{enumerate} </code></pre> <img src="https://zzz-drawing-bed.oss-cn-nanjing.aliyuncs.com/img/image-20250114212322245.png" alt="image-20250114212322245" style="zoom:67%;" /> <pre><code class="language-tex">\begin{itemize}\item An item.\begin{itemize}\item A nested item.\item[+] A `plus' item.\item Another item.\end{itemize}\item Go back to upper level. \end{itemize} </code></pre> <img src="https://zzz-drawing-bed.oss-cn-nanjing.aliyuncs.com/img/image-20250114212430376.png" alt="image-20250114212430376" style="zoom:67%;" /> <p>关键字环境 <span class="math inline">\(\texttt{description}\)</span> 的用法与以上两者类似,不同的是 <code>\item</code> 后的可选参数用来写关键字,以粗体显示,一般是必填的:</p> <pre><code class="language-tex">\begin{description} \item[⟨item title⟩] … \end{description} </code></pre> <pre><code class="language-tex">\begin{description}\item[Enumerate] Numbered list.\item[Itemize] Non-numbered list. \end{description} </code></pre> <img src="https://zzz-drawing-bed.oss-cn-nanjing.aliyuncs.com/img/image-20250114212752393.png" alt="image-20250114212752393" style="zoom:67%;" /> <p>各级无序列表的符号由命令 <code>\labelitemi </code> 到 <code>\labelitemiv</code> 定义,可以简单地重新定义它们:</p> <pre><code class="language-tex">\renewcommand{\labelitemi}{\ddag} \renewcommand{\labelitemii}{\dag} \begin{itemize}\item First item\begin{itemize}\item Subitem\item Subitem\end{itemize}\item Second item \end{itemize} </code></pre> <img src="https://zzz-drawing-bed.oss-cn-nanjing.aliyuncs.com/img/image-20250114213005038.png" alt="image-20250114213005038" style="zoom:67%;" /> <p>有序列表的符号由命令 <code>\labelenumi</code> 到 <code>\labelenumiv</code> 定义,重新定义这些命令需要用到计数器相关命令:</p> <pre><code class="language-tex">\renewcommand{\labelenumi}%{\Alph{enumi}>} \begin{enumerate}\item First item\item Second item \end{enumerate} </code></pre> <img src="https://zzz-drawing-bed.oss-cn-nanjing.aliyuncs.com/img/image-20250114213232649.png" alt="image-20250114213232649" style="zoom:67%;" /> <p>默认的列表间距比较宽,<span class="math inline">\(\LaTeX{}\)</span> 本身也未提供方便的定制功能,可用 <code>enumitem</code> 宏包定制各种列表间距。<code>enumitem</code> 宏包还提供了对列表标签、引用等的定制。有兴趣的读者可参考其帮助文档。</p> <h3 id="对齐环境">对齐环境</h3> <p><span class="math inline">\(\texttt{center}\)</span>、<span class="math inline">\(\texttt{flushleft}\)</span> 和 <span class="math inline">\(\texttt{flushright}\)</span> 环境分别用于生成居中、左对齐和右对齐的文本环境。</p> <pre><code class="language-tex">\begin{center} … \end{center} \begin{flushleft} … \end{flushleft} \begin{flushright} … \end{flushright} </code></pre> <pre><code class="language-tex">\begin{center} Centered text using a \verb|center| environment. \end{center} \begin{flushleft} Left-aligned text using a \verb|flushleft| environment. \end{flushleft} \begin{flushright} Right-aligned text using a \verb|flushright| environment. \end{flushright} </code></pre> <img src="https://zzz-drawing-bed.oss-cn-nanjing.aliyuncs.com/img/image-20250114214234722.png" alt="image-20250114214234722" style="zoom:67%;" /> <p>除此之外,还可以用以下命令直接改变文字的对齐方式:</p> <pre><code class="language-tex">\centering \raggedright \raggedleft </code></pre> <pre><code class="language-tex">\centering Centered text paragraph.\raggedright Left-aligned text paragraph.\raggedleft Right-aligned text paragraph. </code></pre> <img src="https://zzz-drawing-bed.oss-cn-nanjing.aliyuncs.com/img/image-20250114214436517.png" alt="image-20250114214436517" style="zoom:67%;" /> <p>三个命令和对应的环境经常被误用,有直接用所谓 <code>\flushleft</code> 命令或者 <code>raggedright</code> 环境的,都是不甚严格的用法(即使它们可能有效)。有一点可以将两者区分开来:<span class="math inline">\(\texttt{center}\)</span> 等环境会在上下文产生一个额外间距,而 <code>\centering</code> 等命令不产生,只是改变对齐方式。比如在浮动体环境 <span class="math inline">\(\texttt{table}\)</span> 或 <span class="math inline">\(\texttt{figure}\)</span> 内实现居中对齐,用 <code>\centering</code> 命令即可,没必要再用 <span class="math inline">\(\texttt{center}\)</span> 环境。</p> <h3 id="引用环境">引用环境</h3> <p><span class="math inline">\(\LaTeX{}\)</span> 提供了两种引用的环境:<span class="math inline">\(\texttt{quote}\)</span> 用于引用较短的文字,首行不缩进;<span class="math inline">\(\texttt{quotation}\)</span> 用于引用若干段文字,首行缩进。引用环境较一般文字有额外的左右缩进。</p> <pre><code class="language-tex">Francis Bacon says: \begin{quote} Knowledge is power. \end{quote} </code></pre> <img src="https://zzz-drawing-bed.oss-cn-nanjing.aliyuncs.com/img/image-20250114215152828.png" alt="image-20250114215152828" style="zoom:67%;" /> <pre><code class="language-tex">《木兰诗》: \begin{quotation} 万里赴戎机,关山度若飞。 朔气传金柝,寒光照铁衣。 将军百战死,壮士十年归。归来见天子,天子坐明堂。 策勋十二转,赏赐百千强。…… \end{quotation} </code></pre> <img src="https://zzz-drawing-bed.oss-cn-nanjing.aliyuncs.com/img/image-20250114215308777.png" alt="image-20250114215308777" style="zoom:67%;" /> <p><span class="math inline">\(\texttt{verse}\)</span> 用于排版诗歌,与 <span class="math inline">\(\texttt{quotation}\)</span> 恰好相反,<span class="math inline">\(\texttt{verse}\)</span> 是首行悬挂缩进的。</p> <pre><code class="language-tex">Rabindranath Tagore's short poem: \begin{verse} Beauty is truth's smile when she beholds her own face in a perfect mirror. \end{verse} </code></pre> <img src="https://zzz-drawing-bed.oss-cn-nanjing.aliyuncs.com/img/image-20250114215501957.png" alt="image-20250114215501957" style="zoom:67%;" /> <h3 id="摘要环境">摘要环境</h3> <p>摘要环境 <span class="math inline">\(\texttt{abstract}\)</span> 默认只在标准文档类中的 <span class="math inline">\(\texttt{article}\)</span> 和 <span class="math inline">\(\texttt{report}\)</span> 文档类可用,一般用于紧跟 <code>\maketitle</code> 命令之后介绍文档的摘要。如果文档类指定了 <span class="math inline">\(\texttt{titlepage}\)</span> 选项,则单独成页;反之,单栏排版时相当于一个居中的小标题加一个 <span class="math inline">\(\texttt{quotation}\)</span> 环境,双栏排版时相当于 <code>\section*</code> 定义的一节。</p> <h3 id="代码环境">代码环境</h3> <p>有时需要将一段代码原样转义输出,这就要用到代码环境 <span class="math inline">\(\texttt{verbatim}\)</span>,它以等宽字体排版代码,回车和空格也分别起到换行和空位的作用;<br> 带星号的版本更进一步将空格显示成 <code>␣</code>。</p> <pre><code class="language-tex">\begin{verbatim} #include <iostream> int main() {std::cout << "Hello, world!"<< std::endl;return 0; } \end{verbatim} </code></pre> <img src="https://zzz-drawing-bed.oss-cn-nanjing.aliyuncs.com/img/image-20250114220451842.png" alt="image-20250114220451842" style="zoom:67%;" /> <pre><code class="language-tex">\begin{verbatim*} for (int i=0; i<4; ++i)printf("Number %d\n",i); \end{verbatim*} </code></pre> <img src="https://zzz-drawing-bed.oss-cn-nanjing.aliyuncs.com/img/image-20250114220636123.png" alt="image-20250114220636123" style="zoom:67%;" /> <p>要排版简短的代码或关键字,可使用 <code>\verb</code> 命令:</p> <pre><code class="language-tex">\verb⟨delim⟩⟨code⟩⟨delim⟩ </code></pre> <p><delim> 标明代码的分界位置,前后必须一致,除字母、空格或星号外,可任意选择使得不与代码本身冲突,习惯上使用 <span class="math inline">\(\texttt|\)</span> 符号。</p> <p>同 <span class="math inline">\(\texttt{verbatim}\)</span> 环境,<code>\verb</code> 后也可以带一个星号,以显示空格:</p> <pre><code class="language-tex">\verb|\LaTeX| \\ \verb+(a || b)+ \verb*+(a || b)+ </code></pre> <img src="https://zzz-drawing-bed.oss-cn-nanjing.aliyuncs.com/img/image-20250114220953291.png" alt="image-20250114220953291" style="zoom:67%;" /> <p><code>\verb</code> 命令对符号的处理比较复杂,一般 <strong>不能用在其它命令的参数里</strong>,否则多半会出错。</p> <p><span class="math inline">\(\texttt{verbatim}\)</span> 宏包优化了 <span class="math inline">\(\texttt{verbatim}\)</span> 环境的内部命令,并提供了 <code>\verbatiminput</code> 命令用来直接读入文件生成代码环境。<br> <span class="math inline">\(\texttt{fancyvrb}\)</span> 宏包提供了可定制格式的 <span class="math inline">\(\texttt{Verbatim}\)</span> 环境;<span class="math inline">\(\texttt{listings}\)</span> 宏包更进一步,可生成关键字高亮的代码环境,支持各种程序设计语言的语法和关键字。详情请参考各自的帮助文档。</p> <h2 id="表格">表格</h2> <p>排版表格最基本的 <span class="math inline">\(\texttt{tabular}\)</span> 环境用法为:</p> <pre><code class="language-tex">\begin{tabular}[⟨align⟩]{⟨column-spec⟩} ⟨item1⟩ & ⟨item2⟩ & … \\ \hline ⟨item1⟩ & ⟨item2⟩ & … \\ \end{tabular} </code></pre> <p>其中 <column-spec> 是列格式标记,在接下来的内容将仔细介绍;<span class="math inline">\(\texttt\&\)</span> 用来分隔单元格;<code>\\</code> 用来换行;<code>\hline</code> 用来在行与行之间绘制横线。</p> <p>直接使用 <span class="math inline">\(\texttt{tabular}\)</span> 环境的话,会 <strong>和周围的文字混排</strong>。此时可用一个可选参数 <align> 控制垂直对齐:<span class="math inline">\(\verb|t|\)</span> 和 <span class="math inline">\(\verb|b|\)</span> 分别表示按表格顶部、底部对齐,其他参数或省略不写(默认)表示居中对齐。</p> <pre><code class="language-tex">\begin{tabular}{|c|}center-\\ aligned \\ \end{tabular}, \begin{tabular}[t]{|c|}top-\\ aligned \\ \end{tabular}, \begin{tabular}[b]{|c|}bottom-\\ aligned\\ \end{tabular} tabulars. </code></pre> <img src="https://zzz-drawing-bed.oss-cn-nanjing.aliyuncs.com/img/image-20250114222501332.png" alt="image-20250114222501332" style="zoom:67%;" /> <p>但是通常情况下 <span class="math inline">\(\texttt{tabular}\)</span> 环境很少与文字直接混排,而是会放在 <span class="math inline">\(\texttt{table}\)</span> 浮动体环境中,并用 <code>\caption</code> 命令加标题。</p> <h3 id="列格式">列格式</h3> <p><span class="math inline">\(\texttt{tabular}\)</span> 环境使用 <column-spec> 参数指定表格的列数以及每列的格式。基本的列格式见下表。</p> <table> <thead> <tr> <th style="text-align:left"><strong>列格式</strong></th> <th style="text-align:left"><strong>说明</strong></th> </tr> </thead> <tbody> <tr> <td style="text-align:left"><span class="math inline">\(\texttt{l/c/r }\)</span></td> <td style="text-align:left">单元格内容左对齐/居中/右对齐,不折行</td> </tr> <tr> <td style="text-align:left"><span class="math inline">\(\texttt{p\{<width>\}}\)</span></td> <td style="text-align:left">单元格宽度固定为 <width>,可自动折行</td> </tr> <tr> <td style="text-align:left">$</td> <td style="text-align:left">$</td> </tr> <tr> <td style="text-align:left"><span class="math inline">\(@\{<string>\}\)</span></td> <td style="text-align:left">自定义内容 <string></td> </tr> </tbody> </table> <pre><code class="language-tex">\begin{tabular}{lcr|p{6em}}\hlineleft & center & right& par box with fixed width\\L & C & R & P \\\hline \end{tabular} </code></pre> <img src="https://zzz-drawing-bed.oss-cn-nanjing.aliyuncs.com/img/image-20250115130809432.png" alt="image-20250115130809432" style="zoom:67%;" /> <p>表格中每行的单元格数目不能多于列格式里 $\texttt{l/c/r/p} $ 的总数(可以少于这个总数),否则出错。</p> <p><span class="math inline">\(\texttt{@}\)</span> 格式可在单元格前后插入任意的文本,但同时它也消除了单元格前后额外添加的间距。<span class="math inline">\(\texttt{@}\)</span> 格式可以适当使用以充当“竖线”。特别地,<span class="math inline">\(\texttt{@\{\}}\)</span> 可直接用来消除单元格前后的间距:</p> <pre><code class="language-tex">\begin{tabular}{@{} r@{:}lr @{}}\hline1 & 1 & one \\11 & 3 & eleven \\\hline \end{tabular} </code></pre> <img src="https://zzz-drawing-bed.oss-cn-nanjing.aliyuncs.com/img/image-20250115131115056.png" alt="image-20250115131115056" style="zoom:67%;" /> <p>另外还提供了简便的将格式参数重复的写法 <span class="math inline">\(\texttt*\{<n>\}\{<columnspec>\}\)</span>,比如以下两种写法是等效的:</p> <pre><code class="language-tex">\begin{tabular}{|c|c|c|c|c|p{4em}|p{4em}|} \begin{tabular}{|*{5}{c|}*{2}{p{4em}|}} </code></pre> <p>有时需要为整列修饰格式,比如整列改变为粗体,如果每个单元格都加上 <code>\bfseries}</code> 命令会比较麻烦。<code>array</code> 宏包提供了辅助格式 <span class="math inline">\(\texttt>\)</span> 和 <span class="math inline">\(\texttt<\)</span>,用于给列格式前后加上修饰命令:</p> <pre><code class="language-tex">% \usepackage{array} \begin{tabular}{>{\itshape}r<{*}l}\hlineitalic & normal \\column & column \\\hline \end{tabular} </code></pre> <img src="https://zzz-drawing-bed.oss-cn-nanjing.aliyuncs.com/img/image-20250115131903387.png" alt="image-20250115131903387" style="zoom:67%;" /> <p>辅助格式甚至支持插入 <code>\centering</code> 等命令改变 <span class="math inline">\(\texttt{p}\)</span> 列格式的对齐方式,一般还要加额外的命令 <code>\arraybackslash</code> 以免出错。</p> <pre><code class="language-tex">% \usepackage{array} \begin{tabular}% {>{\centering\arraybackslash}p{9em}}\hlineSome center-aligned long text. \\\hline \end{tabular} </code></pre> <img src="https://zzz-drawing-bed.oss-cn-nanjing.aliyuncs.com/img/image-20250115132303588.png" alt="image-20250115132303588" style="zoom:67%;" /> <p><code>array</code> 宏包还提供了类似 <span class="math inline">\(\texttt{p}\)</span> 格式的 <span class="math inline">\(\texttt{m}\)</span> 格式和 <span class="math inline">\(\texttt{b}\)</span> 格式,三者分别在垂直方向上靠顶端对齐、居中以及底端对齐。</p> <pre><code class="language-tex">% \usepackage{array} \newcommand\txt{a b c d e f g h i} \begin{tabular}{cp{2em}m{2em}b{2em}}\hlinepos & \txt & \txt & \txt \\\hline \end{tabular} </code></pre> <img src="https://zzz-drawing-bed.oss-cn-nanjing.aliyuncs.com/img/image-20250115132526382.png" alt="image-20250115132526382" style="zoom:67%;" /> <h3 id="列宽">列宽</h3> <p>在控制列宽方面,<span class="math inline">\(\LaTeX{}\)</span> 表格有着明显的不足:<span class="math inline">\(\texttt{l/c/r}\)</span> 格式的列宽是由文字内容的自然宽度决定的,而 <span class="math inline">\(\texttt{p}\)</span> 格式给定了列宽却不好控制对齐(可用 <code>array</code> 宏包的辅助格式),更何况列与列之间通常还有间距,所以直接生成给定总宽度的表格并不容易。</p> <p><span class="math inline">\(\LaTeX{}\)</span> 本身提供了 <span class="math inline">\(\texttt{tabular*}\)</span> 环境用来排版定宽表格,但是不太方便使用,比如要用到 <span class="math inline">\(\texttt{@}\)</span> 格式插入额外命令,令单元格之间的间距为 <code>\fill</code>,但即使这样仍然有瑕疵:</p> <pre><code class="language-tex">\begin{tabular*}{14em}% {@{\extracolsep{\fill}}|c|c|c|c|}\hlineA & B & C & D \\ \hlinea & b & c & d \\ \hline \end{tabular*} </code></pre> <img src="https://zzz-drawing-bed.oss-cn-nanjing.aliyuncs.com/img/image-20250115132953911.png" alt="image-20250115132953911" style="zoom:67%;" /> <p><code>tabularx</code> 宏包为我们提供了方便的解决方案。它引入了一个 <span class="math inline">\(\texttt{X}\)</span> 列格式,类似 <span class="math inline">\(\texttt{p}\)</span> 列格式,不过会根据表格宽度自动计算列宽,多个 <span class="math inline">\(\texttt{X}\)</span> 列格式平均分配列宽。<br> <span class="math inline">\(\texttt{X}\)</span> 列格式也可以用 <code>array</code> 里的辅助格式修饰对齐方式:</p> <pre><code class="language-tex">% \usepackage{array,tabularx} \begin{tabularx}{14em}% {|*{4}{>{\centering\arraybackslash}X|}}\hlineA & B & C & D \\ \hlinea & b & c & d \\ \hline \end{tabularx} </code></pre> <img src="https://zzz-drawing-bed.oss-cn-nanjing.aliyuncs.com/img/image-20250115133221441.png" alt="image-20250115133221441" style="zoom:67%;" /> <h3 id="横线">横线</h3> <p>在之前的例子见过许多次绘制表格线的 <code>\hline</code> 命令。另外 <code>\cline{<i>-<j>}</code> 用来绘制跨越部分单元格的横线:</p> <pre><code class="language-tex">\begin{tabular}{|c|c|c|}\hline4 & 9 & 2 \\ \cline{2-3}3 & 5 & 7 \\ \cline{1-1}8 & 1 & 6 \\ \hline \end{tabular} </code></pre> <p><img src="https://zzz-drawing-bed.oss-cn-nanjing.aliyuncs.com/img/image-20250115133628644.png" alt="image-20250115133628644" loading="lazy"></p> <p>在科技论文排版中广泛应用的表格形式是三线表,形式干净简明。三线表由 <code>booktabs</code> 宏包支持,它提供了 <code>\toprule</code>、<code>\midrule</code> 和 <code>\bottomrule</code> 命令用以排版三线表的三条线,以及和 <code>\cline</code> 对应的 <code>\cmidrule</code>。除此之外,最好不要用其它横线以及竖线:</p> <pre><code class="language-tex">% \usepackage{booktabs} \begin{tabular}{cccc}\toprule& \multicolumn{3}{c}{Numbers} \\\cmidrule{2-4}& 1 & 2 & 3 \\\midruleAlphabet & A & B & C \\Roman & I & II& III \\\bottomrule \end{tabular} </code></pre> <img src="https://zzz-drawing-bed.oss-cn-nanjing.aliyuncs.com/img/image-20250115140704162.png" alt="image-20250115140704162" style="zoom:67%;" /> <h3 id="合并单元格">合并单元格</h3> <p>横向合并单元格由 <code>\multicolumn</code> 命令实现:</p> <pre><code class="language-tex">\multicolumn{⟨n⟩}{⟨column-spec⟩}{⟨item⟩} </code></pre> <p>其中 <n> 为要合并的列数,<column-spec> 为合并单元格后的列格式,只允许出现一个 <span class="math inline">\(\texttt{l/c/r}\)</span> 或 <span class="math inline">\(\texttt{p}\)</span> 格式。如果合并前的单元格前后带表格线 <span class="math inline">\(\texttt|\)</span>,合并后的列格式也要带 <span class="math inline">\(\texttt|\)</span> 以使得表格的竖线一致。</p> <pre><code class="language-tex">\begin{tabular}{|c|c|c|}\hline1 & 2 & Center \\ \hline\multicolumn{2}{|c|}{3} &\multicolumn{1}{r|}{Right} \\ \hline4 & \multicolumn{2}{c|}{C} \\ \hline \end{tabular} </code></pre> <img src="https://zzz-drawing-bed.oss-cn-nanjing.aliyuncs.com/img/image-20250115142430321.png" alt="image-20250115142430321" style="zoom:67%;" /> <p>上面的例子还体现了,形如 <span class="math inline">\(\texttt{{\\multicolumn}\{1\}\{column-spec\}\{item\}}\)</span> 的命令 <strong>可以用来修改某一个单元格的列格式。</strong></p> <p><strong>纵向合并单元格</strong> 需要用到 <code>multirow</code> 宏包提供的 <code>\multirow</code> 命令:</p> <pre><code class="language-tex">\multirow{⟨n⟩}{⟨width⟩}{⟨item⟩} </code></pre> <p><width> 为合并后单元格的宽度,可以填 <span class="math inline">\(\texttt{*}\)</span> 以使用自然宽度。</p> <p>我们看一个结合 <code>\cline</code>、<code>\multicolumn</code> 和 <code>\multirow</code> 命令的例子:</p> <pre><code class="language-tex">% \usepackage{multirow} \begin{tabular}{ccc}\hline\multirow{2}{*}{Item} &\multicolumn{2}{c}{Value} \\\cline{2-3}& First & Second \\ \hlineA & 1 & 2 \\ \hline \end{tabular} </code></pre> <img src="https://zzz-drawing-bed.oss-cn-nanjing.aliyuncs.com/img/image-20250115142135335.png" alt="image-20250115142135335" style="zoom:67%;" /> <h3 id="嵌套表格">嵌套表格</h3> <p>在以下的例子中,注意要用 <code>\multicolumn</code> 命令配合 <span class="math inline">\(\texttt{@\{\}}\)</span> 格式把单元格的额外边距去掉,使得嵌套的表格线能和外层的表格线正确相连:</p> <pre><code class="language-tex">\begin{tabular}{|c|c|c|}\hlinea & b & c \\ \hlinea & \multicolumn{1}{@{}c@{}|}{\begin{tabular}{c|c}e & f \\ \hlinee & f \\\end{tabular}}& c \\ \hlinea & b & c \\ \hline \end{tabular} </code></pre> <img src="https://zzz-drawing-bed.oss-cn-nanjing.aliyuncs.com/img/image-20250115142824913.png" alt="image-20250115142824913" style="zoom:67%;" /> <p>如果不需要为“拆分的单元格”画线,并且只在垂直方向“拆分”的话,<code>makecell</code> 宏包提供的 <code>\makecell</code> 命令是一个简单的解决方案:</p> <pre><code class="language-tex">% \usepackage{makecell} \begin{tabular}{|c|c|}\hlinea & \makecell{d1 \\ d2} \\\hlineb & c \\\hline \end{tabular} </code></pre> <img src="https://zzz-drawing-bed.oss-cn-nanjing.aliyuncs.com/img/image-20250115143114195.png" alt="image-20250115143114195" style="zoom:67%;" /> <h3 id="行距控制">行距控制</h3> <p><span class="math inline">\(\LaTeX{}\)</span> 生成的表格看起来通常比较紧凑。修改参数 <code>\arraystretch</code> 可以得到行距更加宽松的表格。</p> <pre><code class="language-tex">\renewcommand\arraystretch{1.8} \begin{tabular}{|c|}\hlineReally loose \\ \hlinetabular rows.\\ \hline \end{tabular} \end{example} </code></pre> <img src="https://zzz-drawing-bed.oss-cn-nanjing.aliyuncs.com/img/image-20250115143416039.png" alt="image-20250115143416039" style="zoom:67%;" /> <p>另一种增加间距的办法是给换行命令 <code>\\</code> 添加可选参数,在这一行下面加额外的间距,适合用于在行间不加横线的表格:</p> <pre><code class="language-tex">\begin{tabular}{c}\hlineHead lines \\[6pt]tabular lines \\tabular lines \\ \hline \end{tabular} </code></pre> <img src="https://zzz-drawing-bed.oss-cn-nanjing.aliyuncs.com/img/image-20250115143537544.png" alt="image-20250115143537544" style="zoom:67%;" /> <p>但是这种换行方式的存在导致了一个缺陷——从第二行开始,表格的首个单元格不能直接使用中括号 <span class="math inline">\(\texttt{[]}\)</span>,否则 <code>\\</code> 往往会将下一行的中括号当作自己的可选参数,因而出错。如果要使用中括号,应当放在花括号 <code>{}</code> 里面。或者也可以选择将换行命令写成 <span class="math inline">\(\texttt{\\\\[0pt]}\)</span>。</p> <h2 id="图片">图片</h2> <p><span class="math inline">\(\LaTeX{}\)</span> 本身不支持插图功能,需要由 <code>graphicx</code> 宏包辅助支持。</p> <p>使用 <span class="math inline">\(\texttt{latex + dvipdfmx}\)</span> 编译命令时,调用 <code>graphicx</code> 宏包时要指定 <span class="math inline">\(\texttt{dvipdfmx}\)</span> 选项;而使用 <span class="math inline">\(\texttt{pdflatex}\)</span> 或 <span class="math inline">\(\texttt{xelatex}\)</span> 命令编译时不需要。</p> <p>不同编译命令支持的图片格式种类各异,见下表。这个表格也能解答诸如“为什么 <span class="math inline">\(\texttt{.eps}\)</span> 格式图片在 <span class="math inline">\(\texttt{pdflatex}\)</span> 编译命令下出错”之类的问题。本表格也再一次说明,使用 <span class="math inline">\(\texttt{xelatex}\)</span> 命令是最推荐的方式。</p> <img src="https://zzz-drawing-bed.oss-cn-nanjing.aliyuncs.com/img/image-20250115144839982.png" alt="image-20250115144839982" style="zoom:67%;" /> <p>在调用了 <code>graphicx</code> 宏包以后,就可以使用 <code>\includegraphics</code> 命令加载图片了:</p> <pre><code class="language-tex">\includegraphics[⟨options⟩]{⟨filename⟩} </code></pre> <p>其中 <filename> 为图片文件名,文件名可能需要用相对路径或绝对路径表示。图片文件的扩展名一般可不写。另外一定要注意,<strong>文件名里既不要有空格也不要有多余的英文点号</strong>,否则宏包在解析文件名的过程中会出错。</p> <p>另外 <code>graphicx</code> 宏包还提供了 <code>graphicspath</code> 命令,用于声明一个或多个图片文件存放的目录,使用这些目录里的图片时可不用写路径:</p> <pre><code class="language-tex">% 假设主要的图片放在 figures 子目录下,标志放在 logo 子目录下 \graphicspath{{figures/}{logo/}} </code></pre> <p>在 <code>\includegraphics</code> 命令的可选参数 <options> 中可以使用 <key> = <value> 的形式,常用的参数如下:</p> <img src="https://zzz-drawing-bed.oss-cn-nanjing.aliyuncs.com/img/image-20250115145631351.png" alt="image-20250115145631351" style="zoom:67%;" /> <p><code>graphicx</code> 宏包也支持 <span class="math inline">\(\texttt{draft}\)</span>/<span class="math inline">\(\texttt{final}\)</span> 选项。当 <code>graphicx</code> 宏包或文档类指定 <span class="math inline">\(\texttt{draft}\)</span> 选项时,图片将不会被实际插入,取而代之的是一个包含文件名的与原图片等大的方框。(<strong>加快编译过程</strong>)</p> <h2 id="盒子">盒子</h2> <p>盒子是 <span class="math inline">\(\LaTeX{}\)</span> 排版的基础单元,虽然解释略有抽象:每一行是一个盒子,里面的文字从左到右依次排列;每一页也是一个盒子,各行文字从上到下依次排布……颇有一些活字印刷术的味道。</p> <p>不管如何,<span class="math inline">\(\LaTeX{}\)</span> 提供了一些命令让我们手动生成一些有特定用途的盒子。</p> <h3 id="水平盒子">水平盒子</h3> <p>生成水平盒子的命令如下:</p> <pre><code class="language-tex">\mbox{…} \makebox[⟨width⟩][⟨align⟩]{…} </code></pre> <p><code>\mbox</code> 生成一个基本的水平盒子,内容只有一行,不允许分段(除非嵌套其它盒子,比如后文的垂直盒子)。外表看上去,\cmd{mbox} 的内容与正常的文本无二,不过断行时文字不会从盒子里断开。</p> <p><code>\makebox</code> 更进一步,可以加上可选参数用于控制盒子的宽度 <width>,以及内容的对齐方式 <align>,可选居中 <span class="math inline">\(\texttt{c}\)</span>(默认值)、左对齐 <span class="math inline">\(\texttt{l}\)</span>、右对齐 <span class="math inline">\(\texttt{r}\)</span> 和分散对齐 <span class="math inline">\(\texttt{s}\)</span>。</p> <pre><code class="language-tex">|\mbox{Test some words.}|\\ |\makebox[10em]{Test some words.}|\\ |\makebox[10em][l]{Test some words.}|\\ |\makebox[10em][r]{Test some words.}|\\ |\makebox[10em][s]{Test some words.}| </code></pre> <img src="https://zzz-drawing-bed.oss-cn-nanjing.aliyuncs.com/img/image-20250115150814856.png" alt="image-20250115150814856" style="zoom:67%;" /> <h3 id="带框的水平盒子">带框的水平盒子</h3> <p><code>\fbox</code> 和 <code>\framebox</code> 让我们可以为水平盒子添加边框。使用的语法与 <code>\mbox</code> 和 <code>\makebox</code> 一模一样:</p> <pre><code class="language-tex">\fbox{…} \framebox[⟨width⟩][⟨align⟩]{…} </code></pre> <pre><code class="language-tex">\fbox{Test some words.}\\ \framebox[10em][r]{Test some words.} </code></pre> <img src="https://zzz-drawing-bed.oss-cn-nanjing.aliyuncs.com/img/image-20250115151302157.png" alt="image-20250115151302157" style="zoom:67%;" /> <p>可以通过 <code>\setlength</code> 命令调节边框的宽度 <code>\fboxrule</code> 和内边距 <code>\fboxsep</code>:</p> <pre><code class="language-tex">\framebox[10em][r]{Test box}\\[1ex] \setlength{\fboxrule}{1.6pt} \setlength{\fboxsep}{1em} \framebox[10em][r]{Test box} </code></pre> <img src="https://zzz-drawing-bed.oss-cn-nanjing.aliyuncs.com/img/image-20250115151733062.png" alt="image-20250115151733062" style="zoom:67%;" /> <h3 id="垂直盒子">垂直盒子</h3> <p>如果需要排版一个文字可以换行的盒子,<span class="math inline">\(\LaTeX{}\)</span> 提供了两种方式:</p> <pre><code class="language-tex">\parbox[⟨align⟩][⟨height⟩][⟨inner-align⟩]{⟨width⟩}{…} \begin{minipage}[⟨align⟩][⟨height⟩][⟨inner-align⟩]{⟨width⟩} … \end{minipage} </code></pre> <p>其中 <align> 为盒子和周围文字的对齐情况;<height> 和 <inner-align> 设置盒子的高度和内容的对齐方式,<inner-align> 接受的参数是顶部 <span class="math inline">\(\texttt{t}\)</span>、底部 <span class="math inline">\(\texttt{b}\)</span>、居中 <span class="math inline">\(\texttt{c}\)</span> 和分散对齐 <span class="math inline">\(\texttt{s}\)</span>。</p> <pre><code class="language-tex">三字经:\parbox[t]{3em}% {人之初 性本善 性相近 习相远} \quad 千字文: \begin{minipage}[b][8ex][t]{4em} 天地玄黄 宇宙洪荒 \end{minipage} </code></pre> <img src="https://zzz-drawing-bed.oss-cn-nanjing.aliyuncs.com/img/image-20250115152828516.png" alt="image-20250115152828516" style="zoom:67%;" /> <p>如果在 <code>minipage</code> 里使用 <code>\footnote</code> 命令,生成的脚注会出现在盒子底部,编号是独立的,并且使用小写字母编号。这也是 <span class="math inline">\(\texttt{minipage}\)</span> 环境之被称为“迷你页”(Mini-page)的原因。而在 <code>\parbox</code> 里无法正常使用 <code>\footnote</code> 命令,只能在盒子里使用 <code>\footnotemark</code>,在盒子外使用 <code>\footnotetext</code>。</p> <pre><code class="language-tex">\fbox{\begin{minipage}{15em}%这是一个垂直盒子的测试。\footnote{脚注来自 minipage。} \end{minipage}} </code></pre> <img src="https://zzz-drawing-bed.oss-cn-nanjing.aliyuncs.com/img/image-20250115153544989.png" alt="image-20250115153544989" style="zoom:67%;" /> <h3 id="标尺盒子">标尺盒子</h3> <p><code>\rule</code> 命令用来画一个实心的矩形盒子,也可适当调整以用来画线(标尺):</p> <pre><code class="language-tex">\rule[⟨raise⟩]{⟨width⟩}{⟨height⟩} </code></pre> <pre><code class="language-tex">Black \rule{12pt}{4pt} box.Upper \rule[4pt]{6pt}{8pt} and lower \rule[-4pt]{6pt}{8pt} box.A \rule[-.4pt]{3em}{.4pt} line. </code></pre> <img src="https://zzz-drawing-bed.oss-cn-nanjing.aliyuncs.com/img/image-20250115153851284.png" alt="image-20250115153851284" style="zoom:67%;" /> <h2 id="浮动体">浮动体</h2> <p>内容丰富的文章或者书籍往往包含许多图片和表格等内容。这些内容的尺寸往往太大,导致分页困难。<span class="math inline">\(\LaTeX{}\)</span> 为此引入了浮动体的机制,令大块的内容可以脱离上下文,放置在合适的位置。<br> <span class="math inline">\(\LaTeX{}\)</span> 预定义了两类浮动体环境 <span class="math inline">\(\texttt{figure}\)</span> 和 <span class="math inline">\(\texttt{table}\)</span>。习惯上 <span class="math inline">\(\texttt{figure}\)</span> 里放图片,<span class="math inline">\(\texttt{table}\)</span> 里放表格,但并没有严格限制,可以在任何一个浮动体里放置文字、公式、表格、图片等等任意内容。</p> <p>以 <span class="math inline">\(\texttt{table}\)</span> 环境的用法举例,<span class="math inline">\(\texttt{figure}\)</span> 同理:</p> <pre><code class="language-tex">\begin{table}[⟨placement⟩] … \end{table} </code></pre> <p><placement> 参数提供了一些符号用来表示浮动体允许排版的位置,如 <span class="math inline">\(\texttt{hbp}\)</span> 允许浮动体排版在当前位置、底部或者单独成页。<span class="math inline">\(\texttt{table}\)</span> 和 <span class="math inline">\(\texttt{figure}\)</span> 浮动体的默认设置为 <span class="math inline">\(\texttt{tbp}\)</span>。</p> <img src="https://zzz-drawing-bed.oss-cn-nanjing.aliyuncs.com/img/image-20250115155105789.png" alt="image-20250115155105789" style="zoom:67%;" /> <p>双栏排版环境下,<span class="math inline">\(\LaTeX{}\)</span> 提供了 <span class="math inline">\(\texttt{table*}\)</span> 和 <span class="math inline">\(\texttt{figure*}\)</span> 环境用来排版 <strong>跨栏</strong> 的浮动体。用法与 <span class="math inline">\(\texttt{table}\)</span> 和 <span class="math inline">\(\texttt{figure}\)</span> 一样,不同之处为双栏的 <placement> 参数只能用 <span class="math inline">\(\texttt{tp}\)</span> 两个位置。</p> <p>浮动体的位置选取受到先后顺序的限制。如果某个浮动体由于参数限制、空间限制等原因在当前页无法放置,就要推迟到之后处理,并使得之后的同类浮动体一并推迟。<code>\clearpage</code> 命令会在另起一页之前,先将所有推迟处理的浮动体排版成页,此时 <span class="math inline">\(\texttt{htbp}\)</span> 等位置限制被完全忽略。</p> <p><code>float</code> 宏包为浮动体提供了 <span class="math inline">\(\texttt{H}\)</span> 位置参数,不与 <span class="math inline">\(\texttt{htbp}\)</span> 及 <span class="math inline">\(\texttt{!}\)</span> 混用。使用 <span class="math inline">\(\texttt{H}\)</span> 位置参数时,会取消浮动机制,将浮动体视为一般的盒子插入当前位置。这在一些特殊情况下很有用(如使用 <code>multicol</code> 宏包排版分栏内容的时候),但尺寸过大的浮动体可能使得分页比较困难。</p> <h3 id="浮动体的标题">浮动体的标题</h3> <p>图表等浮动体提供了 <code>\caption</code> 命令加标题,并且自动给浮动体编号,可以用带星号的命令 <code>\caption*</code>(需加载相关宏包,如 <code>caption</code>) 生成不带编号的标题,也可以使用带可选参数的形式 <code>\caption[...]{...}</code>,使得在目录里使用短标题。命令之后还可以紧跟 <code>\label</code> 命令标记交叉引用。</p> <p><code>\caption</code> 生成的标题形如“Figure 1: ...”或“Table 1: ...”可通过修改 <code>\figurename</code> 和 <code>\tablename</code> 的内容来修改标题的前缀。标题样式的定制功能由 <code>caption</code> 宏包提供,详见该宏包的帮助文档,在此不作赘述。</p> <p><span class="math inline">\(\texttt{table}\)</span> 和 <span class="math inline">\(\texttt{figure}\)</span> 两种浮动体分别有各自的生成目录的命令:</p> <pre><code class="language-tex">\listoftables \listoffigures </code></pre> <p>它们类似 <code>\tableofcontents</code> 生成单独的章节。</p> <h3 id="并排和子图表">并排和子图表</h3> <p>我们时常有在一个浮动体里面放置多张图的用法。最简单的用法就是直接并排放置,也可以通过分段或者换行命令 <code>\\</code> 排版多行多列的图片。以下为示意代码,效果大致如图所示。</p> <pre><code class="language-tex">\begin{figure}[htbp]\centering\includegraphics[width=...]{...}\qquad\includegraphics[width=...]{...} \\[...pt]\includegraphics[width=...]{...}\caption{...} \end{figure} </code></pre> <img src="https://zzz-drawing-bed.oss-cn-nanjing.aliyuncs.com/img/image-20250115160703778.png" alt="image-20250115160703778" style="zoom:67%;" /> <p>由于标题是横跨一行的,用 <code>\caption</code> 命令为每个图片单独生成标题就需要借助前文提到的 <code>parbox</code> 或者 <span class="math inline">\(\texttt{minipage}\)</span> 环境,将标题限制在盒子内。效果见图所示。</p> <pre><code class="language-tex">\begin{figure}[htbp]\centering\begin{minipage}{...}\centering\includegraphics[width=...]{...}\caption{...}\end{minipage}\qquad\begin{minipage}{...}\centering\includegraphics[width=...]{...}\caption{...}\end{minipage} \end{figure} </code></pre> <img src="https://zzz-drawing-bed.oss-cn-nanjing.aliyuncs.com/img/image-20250115161039696.png" alt="image-20250115161039696" style="zoom:67%;" /> <p>当需要更进一步,给每个图片定义小标题时,就要用到 <code>subcaption</code> 宏包的功能了。这里仅举一例,效果见图。更详细的用法请参考 <code>subcaption</code> 宏包的帮助文档。</p> <pre><code class="language-tex">\begin{figure}[htbp]\centering\begin{subfigure}{...}\centering\includegraphics[width=...]{...}\caption{...}\end{subfigure}\qquad\begin{subfigure}{...}\centering\includegraphics[width=...]{...}\caption{...}\end{subfigure} \end{figure} </code></pre> <img src="https://zzz-drawing-bed.oss-cn-nanjing.aliyuncs.com/img/image-20250115161220429.png" alt="image-20250115161220429" style="zoom:67%;" /> <p><code>subcaption</code> 依赖上文提到过的 <code>caption</code> 宏包,因此也支持子图表标题样式的定制。并排子图表的功能也可通过 <code>subfig</code> 宏包的 <code>subfloat</code> 命令实现,具体请参考宏包文档。</p> <h2 id="参考文献">参考文献</h2> <p>[1] Partl H, Hyna I, Schlegl E. 一份 (不太) 简短的 LATEX2ε 介绍[J]. 2024. <a href="https://github.com/CTeX-org/lshort-zh-cn" target="_blank">https://github.com/CTeX-org/lshort-zh-cn</a></p> <hr class="footnotes-sep"> <section class="footnotes"> <ol class="footnotes-list"> <li id="fn1" class="footnote-item"><p>出自《千字文》。 <a href="#fnref1" class="footnote-backref">↩︎</a></p> </li> </ol> </section>

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

THREE.js学习笔记6——Geometries

这一小节学习THREE.js中的物理模型。 什么是geometry?(英文解释,翻译为中文就看不懂了,直接看英语吧)Composed of vertices (point coordinates in 3D spaces)and faces (triangles that join those vertices to create a surface) Can be used for meshes but also for par…

第三节 回归实战

数据处理超参:人为指定不能改变测试数据只有x没有标签y 训练数据拆分,82开,作训练集和验证集(验证模型好坏),模型训练不是一路上升的过程,训练几次验证一次,最好的模型save下来 one-hot独热编码 猪(1 0 0) 狗(0 1 0) 猫(0 0 1) def get_feature_importance(feature_data, label…

Windows git bash 文字显示/斜杠开头数字

前言全局说明Windows git bash 文字显示/斜杠开头数字一、说明 详细介绍:https://zhuanlan.zhihu.com/p/133706032二、问题三、解决方法 git config --global core.quotepath false免责声明:本号所涉及内容仅供安全研究与教学使用,如出现其他风险,后果自负。参考、来源: h…

DDR 带宽的计算与监控

DDR 带宽(Double Data Rate Bandwidth)是指 DDR 内存在一秒内可以传输的数据量,通常以 GB/s(Gigabytes per second) 为单位。它是衡量内存系统性能的重要指标,直接影响系统的数据吞吐能力。 1.如何计算 DDR 带宽 计算 DDR 理论带宽的公式为: DDR主频 * 位宽 = 理论带宽其…

1.15

尽力了,之前的粗心导致现在要改很多以前的坑,明天再继续

中考英语优秀范文-热点话题-传统文化-006 Welcome to Chinese Summer Camp 欢迎参加中国夏令营

1 写作要求 假定你是李华,你校今年暑假将为外国学生举办一场汉语夏令营活动(Chinese Summer Camp)。请你根据下面海报的内容,用英语给你的笔友David写一封电子邮件,介绍本次活动并邀请他参加。词数80左右。 Welcome to Chinese Summer Camp Time:July 18th—July 28th, 2…

机器人

本文来自博客园,作者:Traktorea,转载请注明原文链接:https://www.cnblogs.com/kdsmyhome/p/18673586

使用Nginx实现前端映射到公网IP后端内网不映射公网.250115

一、场景: 系统移动端需要映射到公网,但是后端地址不能映射出去 qbpm.xxxx.cn 系统解析内网IP qmbpm.xxxx.cn 移动端解析公网IP 二、思路: 移动端前端公网端口放出80 443端口 移动端后端映射到内网后端地址qbpm.xxxx.cn:8443 三、解决方法: vim nginx.confserver {listen 8…

Qml 中实现任意角为圆角的矩形

在 Qml 中,矩形(Rectangle)是最常用的元素之一。 然而,标准的矩形元素仅允许设置统一的圆角半径。 在实际开发中,我们经常需要更灵活的圆角设置,例如只对某些角进行圆角处理,或者设置不同角的圆角半径。 本文将介绍如何通过自定义 Qml 元素实现一个任意角可为圆角的矩形…

【附源码】JAVA在线投票系统源码+SpringBoot+VUE+前后端分离

学弟,学妹好,我是爱学习的学姐,今天带来一款优秀的项目:在线投票系统源码 。 本文介绍了系统功能与部署安装步骤,如果您有任何问题,也请联系学姐,偶现在是经验丰富的程序员! 一. 系统演示 系统测试截图系统视频演示https://githubs.xyz/show/340.mp4二. 系统概述【 系统…

Python Playwright学习笔记(一)

一、简介 1.1Playwright 是什么? 它是微软在 2020 年初开源的新一代自动化测试工具,其功能和 selenium 类似,都可以驱动浏览器进行各种自动化操作。 1.2、特点是什么支持当前所有的主流浏览器,包括 chrome、edge、firefox、safari; 支持跨平台多语言:支持Windows、Linux、…

智能驾驶数据采集回注测评工具 - ARS

在数据驱动智能驾驶的时代背景下,开发者们总结了一条适用于智能驾驶的数据闭环开发流程,这条开发线路大致包括实车数据采集->数据存储->数据处理->数据分析->数据标注->模型训练->仿真测试->实车测试->部署发布等关键环节,通过不断开发迭代,逐步完…