tabularx - 列宽多列

tabularx - 列宽多列

我正在尝试使用 tabularx 环境创建一个表格,我需要使用多列来重现原始 Word 模板表格。第一张图片是表格的外观,下面是我第一次尝试重现它假定布局

\documentclass[a4paper, 11pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[czech]{babel}
\usepackage[margin=2cm]{geometry}
\usepackage{tabularx}
\newcolumntype{C}{>{\centering\arraybackslash}X}

\begin{document}
\sf
\noindent
\bgroup
\def\arraystretch{1.5}
\begin{center}
    \begin{tabularx}{\textwidth}{||C|C|C|C||}
        \hline \hline
        \multicolumn{4}{||c||}{{\large Ústav technologie stavebních dílců, FAST, VUT v Brně}}\\ [2mm]
        
        \multicolumn{4}{||c||}{{\huge \bfseries BJA006 Technologie betonu - laboratoře}}\\[2mm]
        
        \hline
        \large {\bfseries Číslo protokolu:} &\multicolumn{2}{|c|}{\large {\bfseries Název protokolu:}}  & \large {\bfseries Studijní skupina:} \\[2mm]
        
        \LARGE 1&\multicolumn{2}{|c|}{\LARGE Technologické zkoušky kameniva}  & \LARGE B3M1 \\[2mm]
        
        \hline
        
        \multicolumn{2}{||c|}{{\large \bfseries Vypracovala:}}  & \large {\bfseries Datum:} & \large {\bfseries Kontrolovala:}\\[2mm]
        
        \multicolumn{2}{||c|}{\LARGE XXX BBB} & \LARGE 10.10.2023 & \LARGE XXX BBB \\[2mm]
         
        \hline \hline
    \end{tabularx}
\end{center}
\egroup

\end{document}  

此代码导致如下结果: 第一次尝试

如您所见,垂直线没有按应有的方式对齐。
因此,我在表格末尾添加了空行,结果如下:

第二次尝试

因此,我尝试对单列也使用多列,并得到了原始表格。但使用多列太复杂了。所以,有什么建议可以告诉我我哪里犯了错误吗?我不相信 tex 中有这样的错误。最终代码如下:

\documentclass[a4paper, 11pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[czech]{babel}
\usepackage[margin=2cm]{geometry}
\usepackage{tabularx}
\newcolumntype{C}{>{\centering\arraybackslash}X}

\begin{document}
\sf
\noindent
\bgroup
\def\arraystretch{1.5}
\begin{center}
    \begin{tabularx}{\textwidth}{CCCC}
        \hline \hline
        \multicolumn{4}{||c||}{{\large Ústav technologie stavebních dílců, FAST, VUT v Brně}}\\ [2mm]
        
        \multicolumn{4}{||c||}{{\huge \bfseries BJA006 Technologie betonu - laboratoře}}\\[2mm]
        
        \hline
        \multicolumn{1}{||c}{\large {\bfseries Číslo protokolu:}}   &\multicolumn{2}{|c|}{\large {\bfseries Název protokolu:}}  & \multicolumn{1}{c||}{\large {\bfseries Studijní skupina:}} \\[2mm]
        
        \multicolumn{1}{||c}{\LARGE 1}&\multicolumn{2}{|c|}{\LARGE Technologické zkoušky kameniva}  & \multicolumn{1}{c||}{\LARGE B3M1} \\[2mm]
        
        \hline
        
        \multicolumn{2}{||c|}{{\large \bfseries Vypracovala:}}  &\multicolumn{1}{c|}{\large {\bfseries Datum:}} & \multicolumn{1}{c||}{\large {\bfseries Kontrolovala:}}\\[2mm]
        
        \multicolumn{2}{||c|}{\LARGE XXX BBB} & \multicolumn{1}{c|}{\LARGE 10.10.2023} & \multicolumn{1}{c||}{\LARGE XXX BBB} \\[2mm]
         
        \hline \hline
        &&&\\
    \end{tabularx}
\end{center}
\egroup

\end{document}

答案1

问题是,虽然您将表格定义为具有四列,并且宽度是自动确定的,即残差确定的,但您目前没有提供足够的信息让 LaTeX 能够确定某些组合列的宽度——那些列类型为 的列c。具体来说,无法正确计算左下角两个单元格的宽度。要解决这个问题,您应该自己提供显式的宽度计算,例如,通过替换

\multicolumn{2}{||c|}{{\large \bfseries Vypracovala:}}

\multicolumn{2}{||>{\hsize=\dimexpr2\hsize+2\tabcolsep+1\arrayrulewidth\relax}C|}{%
   \large\bfseries Vypracovala:}

或者更简洁地说,将适用指令c的第二个参数替换为\multicolumn

>{\hsize=\dimexpr2\hsize+2\tabcolsep+1\arrayrulewidth\relax}C

发生了什么事?请注意,虽然C-type 列的默认宽度由参数 给出\hsize,但我们将宽度重置为略大于2\hsize-- 具体来说,2\hsize+2\tabcolsep+1\arrayrulewidth


附录:如果你一定要在表格周围画双垂直线和双水平线,我建议你借助hhline 包及其\hhline宏。而且,由于您使用的是babel带有选项的包czech,我进一步建议您运行该指令\shorthandoff{-}——就在center环境内部——以便启用\hhline单个水平规则。

在此处输入图片描述

\documentclass[a4paper, 11pt]{article}
\usepackage[T1]{fontenc} % <-- new
%\usepackage[utf8]{inputenc} % that's the default nowadays
\usepackage[czech]{babel}
\usepackage[margin=2cm]{geometry}
\usepackage{tabularx}
\newcolumntype{C}{>{\centering\arraybackslash}X}
\usepackage{hhline} % cf. https://www.ctan.org/pkg/hhline

\begin{document}

\begin{center}

\shorthandoff{-} % cf. https://tex.stackexchange.com/a/105935/5001

\def\arraystretch{1.5}
\sffamily

\begin{tabularx}{\textwidth}{|| C|C|C|C ||}
%\hline \hline
\hhline{|t:====:t|} % <-- new

\multicolumn{4}{||c||}{{\large Ústav technologie stavebních dílců, FAST, VUT v Brně}} \\ [2mm]
\multicolumn{4}{||c||}{{\huge\bfseries BJA006 Technologie betonu - laboratoře}} \\[2mm]
        
%\hline
\hhline{||----||} % <-- new

  \large\bfseries Číslo protokolu 
& \multicolumn{2}{|c|}{\large\bfseries Název protokolu}  & \large\bfseries Studijní skupina \\[2mm]
        
  \LARGE 1
& \multicolumn{2}{|c|}{\LARGE Technologické zkoušky kameniva}  
& \LARGE B3M1 \\[2mm]
        
%\hline
\hhline{||----||} % <-- new
        
\multicolumn{2}{||>{\hsize=\dimexpr2\hsize+2\tabcolsep+1\arrayrulewidth\relax}C|}{\large\bfseries Vypracovala}  
& \large\bfseries Datum 
& \large\bfseries Kontrolovala \\[2mm]
        
\multicolumn{2}{||c|}{\LARGE XXX BBB} 
& \LARGE 10.10.2023 
& \LARGE XXX BBB \\[2mm]
         
%\hline\hline
\hhline{|b:====:b|}  % <-- new

\end{tabularx}

\end{center}

\end{document}

答案2

这是一个{NiceTabular}使用 的解决方案nicematrix

\documentclass[a4paper, 11pt]{article}
\usepackage[T1]{fontenc}
\usepackage[czech]{babel}
\usepackage[margin=2cm]{geometry}
\usepackage{nicematrix,tikz}

\begin{document}

\begin{center}
\shorthandoff{-} % cf. https://tex.stackexchange.com/a/105935/5001
\renewcommand{\arraystretch}{1.5}
\sffamily

\begin{NiceTabular}{*{4}{X[c]}}[vlines]
\Hline
\Block{1-4}{\large Ústav technologie stavebních dílců, FAST, VUT v Brně} &&& \\[2mm]
\Block{1-4}{\huge\bfseries BJA006 Technologie betonu - laboratoře} \\[2mm]
\Hline
\RowStyle{\large\bfseries} Číslo protokolu & \Block{1-2}{Název protokolu} && Studijní skupina \\[2mm]
\RowStyle{\LARGE} 1 & \Block{1-2}{Technologické zkoušky kameniva} && B3M1 \\[2mm]
\Hline
\RowStyle{\large\bfseries} \Block{1-2}{Vypracovala} && Datum & Kontrolovala \\[2mm]
\RowStyle{\LARGE} \Block{1-2}{XXX BBB} && 10.10.2023 & XXX BBB \\[2mm]
\Hline
\CodeAfter
  \tikz \draw  ([xshift=-2pt,yshift=2pt]1-|1) rectangle ([xshift=2pt,yshift=-2pt]last-|last) ; 
\end{NiceTabular}

\end{center}

\end{document}

上述代码的输出

由于我没有使用\multicolumn(这会消除 Mico 所解释的列的规格),所以列直接具有预期的宽度(大约\linewidth/4)。

为了放置合并单元格的内容,我使用\Blocknicematrix命令。该命令使用 TikZ 在 PDF 中写入其参数主数组的构造。为了计算正确的位置,该命令\Block依赖于nicematrix先前放入数组中的 TikZ 节点。由于数组已使用正确的宽度构建,因此 TikZ 节点位于正确的位置,并且nicematrix能够将块(和规则)的内容放在预期的位置...

答案3

通过使用tabularray包来解决(为了完整性

相关内容