我正在尝试使用 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
)。
为了放置合并单元格的内容,我使用\Block
了nicematrix
命令。该命令使用 TikZ 在 PDF 中写入其参数后主数组的构造。为了计算正确的位置,该命令\Block
依赖于nicematrix
先前放入数组中的 TikZ 节点。由于数组已使用正确的宽度构建,因此 TikZ 节点位于正确的位置,并且nicematrix
能够将块(和规则)的内容放在预期的位置...
答案3
通过使用tabularray
包来解决(为了完整性