20 长表格内同时指定图片与文字对齐方式遇到冲突?

发布于 2025-05-06 20:31:08

migrate a question here:

希望对于可跨页的长表格排版中实现如下的类似效果:

image.png

具体要求有:

  • 图片保持现有的样式,使用\adjustbox实现垂直居中
  • 所有文字构成的整个文字文本框处于垂直居中的状态
  • 文字文本框内部的文字水平左对齐,且不缩进

目前原OP尝试的MWE为:

\documentclass{ctexart}
\usepackage[margin=1in,landscape]{geometry}
\usepackage{longtable}  
\usepackage{array}
\usepackage{cellspace}
\usepackage{graphicx}
\usepackage[export]{adjustbox}
% \usepackage{tabularray}
% 全局定义表格列类型(兼容 longtable)
\newcolumntype{L}[1]{>{\raggedright\arraybackslash}m{#1}} 
% 左对齐+垂直居中(必须指定宽度)
\newcolumntype{C}[1]{>{\centering\arraybackslash}m{#1}}   
\begin{document}
    
\section{我是一个章节章节章节}

\begin{longtable}{|C{1cm}|C{4cm}|C{5cm}|C{5.2cm}|}
    \caption{画随点运动实时生成的正弦曲线} \label{tab:image_table}  \\ 
    \hline
    % 表头设置(四列)
    \textbf{序号} & \textbf{实验内容} & \textbf{按键操作} & \textbf{截屏显示} \\
    \hline
    \endfirsthead
    % 续表头设置
    \multicolumn{4}{c}%
    {\tablename\ \thetable{} -- 续上页表格} \\
    \hline
    \textbf{序号} & \textbf{实验内容} & \textbf{按键操作} & \textbf{截屏显示} \\
    \hline
    \endhead
    1 & 暂停动画并擦除几何跟踪痕迹&隐藏不需要展示的对象,播放动画,隐藏不需要展示的对象,播放动画,
    &\adjustbox{valign=c, margin=3pt 5pt}{\includegraphics[width=5cm,height=3.5cm]{example-image}}\\
    \hline
    2&测量点$M$ 的坐标 &隐藏不需要展示的对象,播放动画,
    得到点$M$的横、纵坐标,隐藏不需要展示的对象,播放动画,
    &\adjustbox{valign=c, margin=3pt 5pt}{\includegraphics[width=5cm,height=3.5cm]{example-image}}\\
    \hline
    3&保存点$M$ 的横坐标 &    选择点$M$ 的横坐标,依次点击命名为$x_m$  ,或者 鼠标右键
    &\adjustbox{valign=c, margin=3pt 5pt}{\includegraphics[width=5cm,height=3.5cm]{example-image}}\\
    \hline
    4 & 绘制随点 $M$变化生成的正弦曲线 &隐藏不需要展示的对象,播放动画输入相应的表达式
    &\adjustbox{valign=c, margin=3pt 5pt}{\includegraphics[width=5cm,height=3.5cm]{example-image}} \\
    \hline
\end{longtable}
    
\end{document}

得到的效果是,\adjustboxm列格式有一些冲突(如下图):

image.png

预期能有两个答案:

  • 在当前基于longtable的实现上做调整
  • 使用longtblr环境实现更好的内容与样式分离

maybe related:

查看更多

关注者
0
被浏览
271
尊咾哎哟
尊咾哎哟 2天前
¥a^2+b^2=c^2¥. . .

省流:

  1. 修改后三列的对齐方式
  2. 因第1步修改,需单独对表头做居中对齐的处理;
  3. \adjustbox命令中valign的值改为m.

修改后三列的列对齐方式

首先,最后一列的对齐方式需要改为p型。原因未知。

然后:

在文字文本框内部的文字水平左对齐,且不缩进

既然如此,中间两列没必要再使用预设的C型(因为它用了\centering),而直接用m型即可。


需单独对表头做居中对齐处理

从效果图来看,表头内容是居中对齐的。由于改用了m型,故对表头所在行单独做居中对齐处理:

\textbf{序号} & \centering\textbf{实验内容} & \centering\textbf{按键操作} & \makebox[5.2cm][c]{\textbf{截屏显示}}

其中,最后一列在改用了p型的情况下用\centering会报错,所以改用盒子把它“撑开”。


\adjustbox命令中valign的值改为m.

我翻了adjustbox宏包的手册,发现valign键的值只有T,M,B;t,t,m,b,但用c好像也没报错...我不懂看漏了什么,但还是顺便改成m了。
image.png

另外,valign的各值的效果图:
image.png
它的参考系有点诡异,可能与所在列不能用m型对齐的情况有关,但我看了很久没弄明白,交给有缘人了...


MWE

\documentclass{ctexart}
\usepackage[margin=1in,landscape]{geometry}
\usepackage{longtable}  
\usepackage{array}
\usepackage{cellspace}
\usepackage{graphicx}
\usepackage[export]{adjustbox}
% \usepackage{tabularray}
% 全局定义表格列类型(兼容 longtable)
\newcolumntype{L}[1]{>{\raggedright\arraybackslash}m{#1}} 
% 左对齐+垂直居中(必须指定宽度)
\newcolumntype{C}[1]{>{\centering\arraybackslash}m{#1}}   
\begin{document}
    
\section{我是一个章节章节章节}

\begin{longtable}{|C{1cm}|m{4cm}|m{5cm}|p{5.2cm}|}
    \caption{画随点运动实时生成的正弦曲线} \label{tab:image_table}  \\ 
    \hline
    % 表头设置(四列)
    \textbf{序号} & \centering\textbf{实验内容} & \centering\textbf{按键操作} & \makebox[5.2cm][c]{\textbf{截屏显示}} \\
    \hline
    \endfirsthead
    % 续表头设置
    \multicolumn{4}{c}%
    {\tablename\ \thetable{} -- 续上页表格} \\
    \hline
    \textbf{序号} & \centering\textbf{实验内容} & \centering\textbf{按键操作} & \makebox[5.2cm][c]{\textbf{截屏显示}} \\
    \hline
    \endhead
    1 & 暂停动画并擦除几何跟踪痕迹&隐藏不需要展示的对象,播放动画,隐藏不需要展示的对象,播放动画,
    &\adjustbox{valign=m, margin=3pt 5pt}{\includegraphics[width=5cm,height=3.5cm]{example-image}}\\
    \hline
    2&测量点$M$ 的坐标 &隐藏不需要展示的对象,播放动画,
    得到点$M$的横、纵坐标,隐藏不需要展示的对象,播放动画,
    &\adjustbox{valign=m, margin=3pt 5pt}{\includegraphics[width=5cm,height=3.5cm]{example-image}}\\
    \hline
    3&保存点$M$ 的横坐标 &    选择点$M$ 的横坐标,依次点击命名为$x_m$  ,或者 鼠标右键
    &\adjustbox{valign=m, margin=3pt 5pt}{\includegraphics[width=5cm,height=3.5cm]{example-image}}\\
    \hline
    4 & 绘制随点 $M$变化生成的正弦曲线 &隐藏不需要展示的对象,播放动画输入相应的表达式
    &\adjustbox{valign=m, margin=3pt 5pt}{\includegraphics[width=5cm,height=3.5cm]{example-image}} \\
    \hline
\end{longtable}
    
\end{document}

效果:
image.png

2 个回答
Sagittarius Rover
我要成为Typst糕手/(ㄒoㄒ)/~~
预期得到两份答案: 使用longtblr环境实现更好的内容与样式分离

我基于tabularraylongtblr也做了一个尝试:

  • Q列格式可以让你直接摆脱longtable的列格式和array宏包和valign的混合指定,我也妹弄得很明白...
  • 使用header可以实现重复标题行的功能,且该设置位于longtable的环境外,适合移植批量配置表格样式
  • 使用row{1}={font=\bfseries}也可以避免使用四次\textbf的尴尬支持
  • 似乎文档更建议用\adjustimage代替\adjustbox{\includegraphics{}}
  • tabularray!优雅永不过时~
\documentclass[fontset=fandol]{ctexart}
\usepackage[margin=1in,landscape]{geometry}
\usepackage{graphicx}
\usepackage{adjustbox}
\usepackage{tabularray}
\newcommand*{\inserttxt}{I can eat the glass and it doesn't hute me.}
\DeclareTblrTemplate{contfoot-text}{normal}{(见下页)}
\SetTblrTemplate{contfoot-text}{normal}
\DeclareTblrTemplate{conthead-text}{normal}{ -- 续上页表格}
\SetTblrTemplate{conthead-text}{normal}

\begin{document}
    
\section{我是一个章节章节章节}

\begin{longtblr}[
    label = {tblr:a longtblr},
    caption = {这是一个长长长长长长长长长长长长表格},
    ]{
        colspec = {Q[c,m,1cm]Q[m,4cm]Q[m,5cm]Q[c,m,5.5cm]},vlines,hlines,
        row{1} = {font=\large\bfseries,halign=c},
        row{2-5} = {ht=4cm},
        width = .6\linewidth,%自行控制
        stretch = 0,
        rowhead = 1,
    }
    No. & Content & Content & Graphs \\
    1 & \inserttxt & \inserttxt & \adjustbox{valign=m, margin=3pt 5pt}{\includegraphics[width=5cm,height=3.5cm]{example-image-A}} \\
    2 & \inserttxt\inserttxt & \inserttxt\inserttxt & \adjustbox{valign=m, margin=3pt 5pt}{\includegraphics[width=5cm,height=3.5cm]{example-image-B}} \\
    3 & \inserttxt\inserttxt\inserttxt & \inserttxt\inserttxt\inserttxt & \adjustbox{valign=m, margin=3pt 5pt}{\includegraphics[width=5cm,height=3.5cm]{example-image-C}} \\
    4 & Alpha & Beta & \adjustimage{valign=m, margin=3pt 5pt,width=5cm}{example-image} \\
\end{longtblr}
    
\end{document}

image.png

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览