LaTex表格绘制的小技巧

时间:2024-03-15 19:34:06

前言

由于毕设开题报告是用 WordWord 写的,当时在画表格的时候由于表格太大,只能在ExcelExcel 里画完再截图放进 WordWord 中,但是显示的结果还是不尽人意。正好之前在做互信息介绍的整理时学习了 LaTexLaTex 的基础。因此这次在写毕设论文前两章时就又拿 LaTexLaTex 来写。

言归正传,这篇文章主要讲的是用 LaTexLaTex 绘制表格时,如何合并单元格 以及 表格太大时如何处理

合并单元格

  1. 引入包:
\usepackage{multirow}
  1. 通过命令 \multicolumn\multirow 进行合并单元格。
  • \multicolumn{参数1}{参数2}{参数3}
    • 参数1 表示要将整个单元格分成多少列
    • 参数2 表示对齐方式
    • 参数3 表示这个单元格的内容
  • \multirow{参数1}{参数2}{参数3}
    • 参数1 表示要将整个单元格分成多少行
    • 参数2 表示对齐方式
    • 参数3 表示这个单元格的内容
  • 示例:
    • \multicolumn{2}{c|}{时间序列模型} 指的是这个单元格占两列。
    • \multirow{2}{*}{名称} 指的是这个单元格占两行(可以用来垂直居中)
    • \multicolumn{2}{c|}{\multirow{2}{*}{方法}} 指的是 方法这个内容所处的单元格占两行,同时也占两列。如果 \multirow 前面没有 \multicolumn的话,默认就是只占一列。
  1. 代码示例:

代码:

\begin{table}[!htbp] 
\caption{demo1}
\label{demo1}
\centering
\begin{tabular}{|c|c|c|c|c|}   
\hline
\multirow{2}{*}{多行}&
\multicolumn{2}{c|}{多列}&
\multicolumn{2}{c|}{\multirow{2}{*}{多行多列}} \\
\cline{2-3}
  & 多列1 & 多列2 & \multicolumn{2}{c|}{}  \\
\hline
label-1 & label-2&label-3 & label-4& label-5\\
\hline
\end{tabular}
\end{table}

解释:

  • \begin{tabular}{|c|c|c|c|c|} 中的c数量应该与表格中的列的数量一致,比如这里有5列
  • 表头中第三列是多行多列的情况,因此如果表头中没有子表头的话,需要用\multicolumn{2}{c|}{}进行占位
  • \cline{2-3}表示在第2列和第3列头顶画出横线,下标从1开始。
  • 多了 & 多列1 & 多列2 & \multicolumn{2}{c|}{} \\是因为前面说了\multirow{2}{*}{多行}表示有个单元格占了两行,而\multicolumn{2}{c|}{多列}默认是只占一行的,因此还要用这句代码来对第二行进行填充

效果:
LaTex表格绘制的小技巧

表格内容太长

  1. 可以使用\setlength{\tabcolsep}{0.23mm}{\begin{tabular}……\end{tabular}}调整表格宽度,其中 0.23mm 用来控制表格的宽度

  2. 代码示例

% before
\begin{table}[!htbp] 
\caption{demo2-before}
\label{demo2-before}
\centering
\begin{tabular}{|c|c|c|}
\hline
我是一个很长很长很长很长很长很长很长很长的字符串 & 我也是 & 我也是呀 \\
我才不是 & 我也是 & 你到底是是还是不是 \\
\hline
\end{tabular}
\end{table}

% after
\begin{table}[!htbp] 
\caption{demo2-after}
\label{demo2-after}
\centering
\setlength{\tabcolsep}{0.23mm}{
\begin{tabular}{|c|c|c|}
\hline
我是一个很长很长很长很长很长很长很长很长的字符串 & 我也是 & 我也是呀 \\
我才不是 & 我也是 & 你到底是是还是不是 \\
\hline
\end{tabular}}
\end{table}

效果:
LaTex表格绘制的小技巧

单元格内容太长换行

对于单元格中,内容太长需要换行的情况,可以有两种解决方法:

  • 控制每一列的长度:\begin{tabular}{|p{3.5cm}|p{2cm}|p{8cm}|}
  • 手动换行,即在两行之间不画线,不使用 \hline进行分割,这样看起来就像是一个单元格。

方法一:控制每一列的长度

通过\begin{tabular}{|p{3.5cm}|p{2cm}|p{8cm}|}控制每一列的长度,超过该长度的部分会自动换行
代码示例:

% before
\begin{table}[!htbp] \centering
\caption{demo3-method1-before}
\label{demo3-method1-before}
\centering
\begin{tabular}{|c|c|c|}
\hline
\textbf{协议} & \textbf{网络层次} & \textbf{描述} \\ 
\hline
IP & 网络层 & IP协议是将多个包交换网络连接起来,它在源地址和目的地址之间传送一种称之为数据包的东西,它还提供对数据大小的重新组装功能,以适应不同网络对包大小的要求。IP不提供可靠的传输服务,它不提供端到端的或(路由)结点到(路由)结点的确认,对数据没有差错控制,它只使用报头的校验码,它不提供重发和流量控制。如果出错可以通过ICMP报告,ICMP在IP模块中实现。 \\
\hline

\end{tabular}
\end{table}




% after
\begin{table}[!htbp] \centering
\caption{demo3-method1-after}
\label{demo3-method1-after}
\centering
\begin{tabular}{|p{3.5cm}|p{2cm}|p{8cm}|}
\hline
\textbf{协议} & \textbf{网络层次} & \textbf{描述} \\ 
\hline
IP & 网络层 & IP协议是将多个包交换网络连接起来,它在源地址和目的地址之间传送一种称之为数据包的东西,它还提供对数据大小的重新组装功能,以适应不同网络对包大小的要求。IP不提供可靠的传输服务,它不提供端到端的或(路由)结点到(路由)结点的确认,对数据没有差错控制,它只使用报头的校验码,它不提供重发和流量控制。如果出错可以通过ICMP报告,ICMP在IP模块中实现。 \\
\hline

效果:
LaTex表格绘制的小技巧

方法二:手动换行

在两行之间不添加\hline等横线代码,手动对内容进行分行,让需要换行的内容写到下一行的代码中。

代码示例:

% before
\begin{table}[!htbp] \centering
\caption{demo3-method1-before}
\label{demo3-method1-before}
\centering
\begin{tabular}{|c|c|c|}
\hline
\textbf{协议} & \textbf{网络层次} & \textbf{描述} \\ 
\hline
IP & 网络层 & IP协议是将多个包交换网络连接起来,它在源地址和目的地址之间传送一种称之为数据包的东西,它还提供对数据大小的重新组装功能,以适应不同网络对包大小的要求。IP不提供可靠的传输服务,它不提供端到端的或(路由)结点到(路由)结点的确认,对数据没有差错控制,它只使用报头的校验码,它不提供重发和流量控制。如果出错可以通过ICMP报告,ICMP在IP模块中实现。 \\
\hline

\end{tabular}
\end{table}


% 手动换行
\begin{table}[!htbp] \centering
\caption{demo3-method1-after}
\label{demo3-method1-after}
\centering
\begin{tabular}{|c|c|c|}
\hline
\textbf{协议} & \textbf{网络层次} & \textbf{描述} \\
\hline
IP & 网络层 & IP协议是将多个包交换网络连接起来,\\
 &  & 它在源地址和目的地址之间传送一种称之为数据包的东西,\\
 &  & 它还提供对数据大小的重新组装功能,\\
  &  & 以适应不同网络对包大小的要求。\\
 &  & IP不提供可靠的传输服务,它不提供端到端的或(路由)结点 \\
  &  & 到(路由)结点的确认,对数据没有差错控制,\\
 &  & 它只使用报头的校验码,它不提供重发和流量控制。\\
  &  & 如果出错可以通过ICMP报告,ICMP在IP模块中实现。 \\
\hline

\end{tabular}
\end{table}


% 垂直居中
\begin{table}[!htbp] \centering
\caption{demo3-method1-after-after}
\label{demo3-method1-after-after}
\centering
\begin{tabular}{|c|c|c|}
\hline
\textbf{协议} & \textbf{网络层次} & \textbf{描述} \\
\hline
\multirow{8}{*}{IP} & \multirow{8}{*}{网络层} & IP协议是将多个包交换网络连接起来,\\
 &  & 它在源地址和目的地址之间传送一种称之为数据包的东西,\\
 &  & 它还提供对数据大小的重新组装功能,\\
  &  & 以适应不同网络对包大小的要求。\\
 &  & IP不提供可靠的传输服务,它不提供端到端的或(路由)结点 \\
  &  & 到(路由)结点的确认,对数据没有差错控制,\\
 &  & 它只使用报头的校验码,它不提供重发和流量控制。\\
  &  & 如果出错可以通过ICMP报告,ICMP在IP模块中实现。 \\
\hline

\end{tabular}
\end{table}

解释:
可以看到,虽然第二个示例解决了换行的问题,但是在这一行中的IP网络层这两个内容并没有显示垂直居中,这是因为这两个单元格是在最上面的那一行。因此可以用 \multirow{8}{*}{IP} 表示IP这个内容占了8行,结果显示出来就会垂直居中,如第三个结果所示。

注意:

  • \multirow{8}{*}{IP}需要加在当前的要垂直居中的那一项上,而不是表头。并且,第一个参数8的由来是因为我将过长的内容分成了8
  • 手动换行的内容,仍然需要在那一行后面加上换行的代码: \\

效果:
LaTex表格绘制的小技巧


后记

这篇是我记录关于LaTex表格的一些代码,方便以后需要的时候拿来使用。有什么不足、错误之处还请批评指正。っ゚Д゚)っ