具有 tabularx 和多列和多行的自定义表

具有 tabularx 和多列和多行的自定义表

我想用 latex 创建自定义表格,但我的表格大小有问题,它没有在文档宽度的末尾结束。我不明白为什么,因为 5x0.2\textwidth = 1 \textwidth。

\documentclass{article}
\usepackage{graphicx}
\usepackage[export]{adjustbox}
\usepackage{tabularx} % in the preamble
\usepackage{multirow}

\usepackage{geometry}
 \geometry{
 a4paper,
 total={170mm,257mm},
 left=10mm,
 right= 10mm,
 top=10mm,
 }

\begin{document}

\noindent\begin{tabularx}{\textwidth} { 
  | >{\centering\arraybackslash}m{.2\textwidth}
  | >{\centering\arraybackslash}m{.2\textwidth}
  | >{\centering\arraybackslash}m{.2\textwidth}
  | >{\centering\arraybackslash}m{.2\textwidth}
  | >{\centering\arraybackslash}m{.2\textwidth} | 
  }
\hline
\multirow{5}{*}{logo} & \multicolumn{3}{c|}{C A}                  & M     \\ \cline{2-5} 
                      & \multicolumn{3}{c|}{Titre}                          & R    \\ \cline{2-5} 
                      & a & b & c & B   \\ \cline{2-5} 
                      & d & e & f & Autres \\ \cline{2-5} 
                      & h & i & j & DATE   \\ \hline
\end{tabularx}


\end{document}

我该如何解决这个问题?

答案1

  • tabularx表应至少有一个 X 列或从其派生的类型
  • 如果某些列应该有不同的宽度,您可以定义它们之间的比率,或者将某些列写为p{<width>}m{<width>}
  • 在你的情况下我宁愿使用tabularray包而不是tabularx因为
    • 代码更短,
    • 单元格内容垂直间距更好(居中)
    • 如果需要的话,可以简单地改变列宽之间的比例

例如,当所有列具有相同的宽度时:

\documentclass{article}
\usepackage{geometry}
\geometry{a4paper,
          total={170mm,257mm},
          hmargin=10mm,
          top=10mm,
          }
\usepackage{tabularray}

\begin{document}

\noindent\begin{tblr}{hlines, vlines,
                      colspec = {*{5}{X[c]}}
                      }
\SetCell[r=5]{c}    logo
    &   \SetCell[c=3]{c} C A                 
        &   &   &   M               \\  
    &   \SetCell[c=3]{c} Titre
        &   &   &   R               \\
    & a & b & c &   B               \\
    & d & e & f &   Autres          \\
    & h & i & j &   DATE            \\ 
\end{tblr}
\end{document}

在此处输入图片描述

单元格宽度不同的情况:

\documentclass{article}
\usepackage{geometry}
\geometry{a4paper,
          total={170mm,257mm},
          hmargin=10mm,
          top=10mm,
          }
\usepackage{tabularray}

\begin{document}

\noindent\begin{tblr}{hlines, vlines,
                      colspec = {X[0.8, c] X[c] X[2, c] X[c] X[1.2, c]}
                      }
\SetCell[r=5]{c}    logo
    &   \SetCell[c=3]{c} C A                 
        &   &   &   M               \\  
    &   \SetCell[c=3]{c} Titre
        &   &   &   R               \\
    & a & b & c &   B               \\
    & d & e & f &   Autres          \\
    & h & i & j &   DATE            \\ 
\end{tblr}
\end{document}

在此处输入图片描述

答案2

我有一个可以运行的(不完美的)代码,可以完成以下输出:

在此处输入图片描述

代码:

\documentclass{article}
\usepackage{graphicx}
\usepackage[export]{adjustbox}
\usepackage{tabularx} % in the preamble
\usepackage{multirow}

\usepackage{geometry}
\geometry{
    a4paper,
    total={170mm,257mm},
    left=10mm,
    right= 10mm,
    top=10mm,
}

\begin{document}
    
    \noindent\begin{tabularx}{\textwidth} { 
            | >{\centering\arraybackslash}m{.18\textwidth}
            | >{\centering\arraybackslash}m{.18\textwidth}
            | >{\centering\arraybackslash}m{.18\textwidth}
            | >{\centering\arraybackslash}m{.18\textwidth}
            | >{\centering\arraybackslash}m{.18\textwidth} | 
        }
        \cline{1-5}
        \multirow{5}{*}{logo} & \multicolumn{3}{c|}{C A}      & M     \\ \cline{2-5} 
        & \multicolumn{3}{c|}{Titre}                          & R    \\ \cline{2-5} 
        & a & b & c & B   \\ \cline{2-5} 
        & d & e & f & Autres \\ \cline{2-5} 
        & h & i & j & DATE   \\ \cline{1-5}
    \end{tabularx}
        
\end{document}

答案3

这有效:

\documentclass{article}
\usepackage{graphicx}
\usepackage[export]{adjustbox}
\usepackage{tabularx} % in the preamble
\usepackage{multirow}

\usepackage{geometry}
 \geometry{
 a4paper,
 %total={170mm,257mm},
 left=10mm,
 right= 10mm,
 top=10mm,
 }

\begin{document}

\noindent\begin{tabularx}{\textwidth} { 
  *{5}{| >{\centering\arraybackslash}X}| 
  }
\hline
\multirow{5}{*}{logo} & \multicolumn{3}{c|}{C A}                  & M     \\ \cline{2-5} 
                      & \multicolumn{3}{c|}{Titre}                          & R    \\ \cline{2-5} 
                      & a & b & c & B   \\ \cline{2-5} 
                      & d & e & f & Autres \\ \cline{2-5} 
                      & h & i & j & DATE   \\ \hline
\end{tabularx}
\end{document}

X将拉伸以填充可用空间,这必须考虑垂直线和列间空间。这是包存在的唯一原因tabularx……否则,您只需使用正常tabular*环境即可。

您还可以使用乘数来避免重复输入5次相同的内容。

我还删除了total几何中的一个说明符:如果您给出纸张尺寸、左边距和右边距,则您已经完全指定了尺寸......

在此处输入图片描述

答案4

你似乎没有真的想要一个tabularx环境。特别是,您似乎不需要在任何单元格中自动换行。相反,您似乎“只是”想创建一个具有五个等宽列的表格。

如果这个解释是正确的,我建议您(a)使用tabular环境而不是tabularx环境和(b)加载array包并使用其w列类型,这可以让您指定列所需的可用的宽度。(在 LaTeX 表中,列的总宽度通常是 (a) 可用宽度与 (b) 两侧的任何空白填充的总和,由参数给出\tabcolsep。)

下表有五列,可用宽度为2cm

在此处输入图片描述

\documentclass{article}
\usepackage{array}    % for 'w' column type
\usepackage{multirow}
\usepackage{geometry}
\geometry{a4paper, total={170mm,257mm}, top=10mm}

\begin{document}

\begin{center}
\setlength\extrarowheight{2pt} % for a less cramped "look"
\begin{tabular}{ | *{5}{w{c}{2cm}|} }
\hline
\multirow{5}{*}{logo} 
   & \multicolumn{3}{c|}{C A}   & M \\ \cline{2-5} 
   & \multicolumn{3}{c|}{Titre} & R \\ \cline{2-5} 
   & a & b & c                  & B \\ \cline{2-5} 
   & d & e & f                  & Autres \\ \cline{2-5} 
   & h & i & j                  & DATE   \\ \hline
\end{tabular}
\end{center}

\end{document}

相关内容