
решение1
таблицы calstable и tabularx
Вот обе ваши таблицы, набранные как calstable
s,то есть. с использованием пакетакал. Я также набрал первую таблицу с помощьютабличныйx,hhline,множествоимногорядный. Я использовалтабличныйx, поскольку этот пакет может рассчитать ширину столбца, принимая во внимание все необходимые переменные.
калстабильный
calstable
не поддерживает двойные линии (двойные границы), поэтому я сымитировал такие линии с помощью узких строк и столбцов.
Так как я набрал обе таблицы в одном документе, я переместил команды настройки таблицы и определения ярлыков выключения из преамбулы таблицы в преамбулу документа. Я подправил все правила (строки), убедившись, что ни одно правило не режет двойные двойные правила. Поэтому вы увидите ярлык \lb
, \rb
используемый в нескольких местах, для отключения удаления и включения правил для отдельных ячеек. То, как двойные вертикальные линии будут соединяться с двойными горизонтальными линиями, зависит от местных типографских традиций, поэтому я не гарантирую, что мой выбор будет правильным в вашей юрисдикции.
Я заполнил часть содержимого ячеек, чтобы задать правильную высоту строк в таблице, и, как следствие, увеличил высоту строк в первой таблице додва \baselineskip
s, по сравнению с предыдущим примером. Кроме того, я вертикально центрировал содержимое ячеек во всех ячейках, используя документированный хук, см. команду \def\cals@AtBeginCell{\vfil}
:
\documentclass{article}
\usepackage{cals}
% Set up the carlstable
\makeatletter
%% All rules of same weight
\def\cals@framers@width{0.3pt} % Outside frame rules, reduce if the rule is too heavy
\def\cals@framecs@width{0.3pt}
\def\cals@bodyrs@width{0.3pt}
\def\cals@cs@width{0.3pt} % Inside rules, reduce if the rule is too heavy
\def\cals@rs@width{0.3pt}
\def\cals@AtBeginCell{\vfil} % All cell contents vertically centred
% Shorthands for spanning cells, table rules and the spece between columns and rows (padding)
\let\nc=\nullcell
\let\sc=\spancontent
\def\rb{\ifx\cals@borderR\relax % Right Border (rules) switch (off-on)
\def\cals@borderR{0.0pt}
\else \let\cals@borderR\relax\fi}
\def\lb{\ifx\cals@borderL\relax % Left Border switch (off-on)
\def\cals@borderL{0.0pt}
\else \let\cals@borderL\relax\fi}
\def\bb{\ifx\cals@borderB\relax % Bottom Border switch (off-on)
\def\cals@borderB{0.0pt}
\else \let\cals@borderB\relax\fi}
\def\tp{\ifdim\cals@paddingT=0.0pt\relax % Top padding switch (off-on)
\cals@setpadding{Ag}
\else \setlength{\cals@paddingT}{0pt}\fi}
\def\bp{\ifdim\cals@paddingB=0.0pt\relax % Bottom padding switch (off-on)
\cals@setpadding{Ag}
\else \setlength{\cals@paddingB}{0pt}\fi}
\makeatother
\begin{document}
\begin{calstable}[c]
% Defining 11 columns, 2 are for double vertical rules (col2 and col7)
\colwidths{{\dimexpr(\columnwidth/21*3)}
{2pt}
{\dimexpr(\columnwidth/21*2)}
{\dimexpr(\columnwidth/21*1)}
{\dimexpr(\columnwidth/21*2)}
{\dimexpr(\columnwidth/21*4)}
{2pt}
{\dimexpr(\columnwidth/21*2)}
{\dimexpr(\columnwidth/21*1)}
{\dimexpr(\columnwidth/21*2)}
{\dimexpr(\columnwidth/21*4)}
}
\makeatletter
% R1H1 % This first row is just to ‘fake’ double horizontal lines
\thead{%
\brow
\rb\tp\cell{}
\bb\cell{}\bb
\cell{}
\cell{}
\cell{}
\cell{}
\bb\cell{}\bb
\cell{}
\cell{}
\cell{}\rb
\cell{}\tp
\ht\cals@current@row=2pt
\erow
%
%R2H2 % Header
\brow
\alignC\cell{C}
\bb\cell{}\bb
\nc{ltb}
\nc{tb}
\nc{tb}
\nc{rtb}\sc{}
\bb\cell{}\bb
\nc{ltb}
\nc{tb}
\nc{tb}
\nc{rtb}\sc{}
\erow
}
\tfoot{\lastrule\strut}
%R3B1
\brow
\cell{C}
\bb\cell{}\bb
\nc{ltb}
\nc{rtb}\sc{}
\cell{}
\cell{}
\bb\cell{}\bb
\nc{ltb}
\nc{rtb}\sc{}
\cell{}
\cell{}
\erow
%R4B2
\brow
\nc{lrt}
\bb\cell{}\bb
\cell{}
\cell{}
\cell{}
\cell{}
\bb\cell{}\bb
\cell{}
\cell{}
\cell{}
\cell{}
\ht\cals@current@row=2\normalbaselineskip
\erow
%R5B3
\brow
\nc{lrb}\alignC\sc{C}
\bb\cell{}\bb
\cell{C}
\cell{}
\cell{}
\cell{}
\bb\cell{}\bb
\cell{}
\cell{}
\cell{}
\cell{}
\erow
%R6B4
\brow
\nc{lrt}
\bb\cell{}\bb
\cell{}
\cell{}
\cell{}
\cell{}
\bb\cell{}\bb
\cell{}
\cell{}
\cell{}
\cell{}
\ht\cals@current@row=2\normalbaselineskip
\erow
%R7B5
\brow
\nc{lrb}\alignC\sc{C}
\bb\cell{}\bb
\cell{C}
\cell{}
\cell{}
\cell{}
\bb\cell{}\bb
\cell{}
\cell{}
\cell{}
\cell{}
\erow
%R8B6
\brow
\nc{lrt}
\bb\cell{}\bb
\cell{}
\cell{}
\cell{}
\cell{}
\bb\cell{}\bb
\cell{}
\cell{}
\cell{}
\cell{}
\ht\cals@current@row=2\normalbaselineskip
\erow
%R9B7
\brow
\nc{lrb}\alignC\sc{C}
\bb\cell{}\bb
\cell{C}
\cell{}
\cell{}
\cell{}
\bb\cell{}\bb
\cell{}
\cell{}
\cell{}
\cell{}
\erow
%R10B9 % This last row is just to ‘fake’ double horizontal lines
\brow
\rb\bp\cell{}
\cell{}
\cell{}
\cell{}
\cell{}
\cell{}
\cell{}
\cell{}
\cell{}
\cell{}\rb
\cell{}\bp
\ht\cals@current@row=2pt
\erow
\makeatletter
\end{calstable}\par
\vspace{1cm}
\begin{calstable}[l]
% Defining 5 columns, 1 are for double vertical rules (col2)
\colwidths{{\dimexpr(\columnwidth/15*3)}
{2pt}
{\dimexpr(\columnwidth/15*2)}
{\dimexpr(\columnwidth/15*1)}
{\dimexpr(\columnwidth/15*3)}
}
\makeatletter
% R1H1 % This first row is just to ‘fake’ double horizontal lines
\thead{%
\brow
\rb\tp\cell{}
\bb\cell{}\bb
\cell{}
\cell{}
\cell{}\rb\tp
\ht\cals@current@row=2pt
\erow
%
%R2H2 % Header
\brow
\alignC\cell{C}
\bb\cell{}\bb
\cell{}
\cell{}
\cell{}
\erow
}
\tfoot{\lastrule\strut}
%R4B2
\brow
\bb\cell{C}
\cell{}
\cell{}
\cell{}
\cell{}
\erow
%R5B3
\brow
\cell{C}
\cell{}
\cell{}
\cell{}
\cell{}
\erow
%R6B4
\brow
\cell{C}
\cell{}
\cell{}
\cell{}
\cell{}
\erow
%R7B5
\brow
\cell{C}
\cell{}
\cell{}
\cell{}
\cell{}
\erow
%R8B6
\brow
\bb\cell{C}\bb
\cell{}
\bb\cell{}
\cell{}
\cell{}\bb
\erow
%R10B9 % This last row is just to ‘fake’ double horizontal lines
\brow
\bb\rb\bp\cell{}
\cell{}
\cell{}
\cell{}\rb
\cell{}\bb
\ht\cals@current@row=2pt
\erow
\makeatletter
\end{calstable}\par
\end{document}
tabularx и друзья
Вот ваша первая таблица, набранная с помощьютабличныйxи друзья. Как вы увидите, настройка и определение столбцов и ширины столбцов довольно сложны. Чтобы иметь правильные правила соединения, я использовалhhlineупаковка.
\documentclass{article}
\usepackage{array, tabularx, multirow, hhline}
% Two shorthands to secured equal rowheigth
\newcommand*{\hz}{\vphantom{\parbox[c]{1cm}{\rule{1cm}{1.5\normalbaselineskip}}}}
\newcommand*{\vz}{\vphantom{\parbox[c]{1cm}{\rule{1cm}{2.5\normalbaselineskip}}}}
% Define four new X column types based on width. tabularx takes care of the maths involved
\newcolumntype{A}{>{\centering\arraybackslash\hsize=0.4\hsize\linewidth=\hsize}X}
\newcolumntype{B}{>{\centering\arraybackslash\hsize=0.3\hsize\linewidth=\hsize}X}
\newcolumntype{C}{>{\centering\arraybackslash\hsize=0.2\hsize\linewidth=\hsize}X}
\newcolumntype{D}{>{\centering\arraybackslash\hsize=0.1\hsize\linewidth=\hsize}X}
% Uncomment to see margins etc.
%\usepackage{showframe}
%\renewcommand*\ShowFrameColor{\color{red}}
%\renewcommand*\ShowFrameLinethickness{.15pt}
\setlength{\tabcolsep}{0.5em}
\setlength{\extrarowheight}{4pt} % Push first line of text away from rules above.
\begin{document}
\centering
\begin{tabularx}{\linewidth}{|B||C|D|C|A||C|D|C|A|}
\hhline{|*{9}{=}|}
\hz B & \multicolumn{4}{c||}{} & \multicolumn{4}{c|}{}\\
\hhline{|-||----||----|}
\hz B & \multicolumn{2}{c|}{} & & & \multicolumn{2}{c|}{} & & \\
\hhline{|-||--|-|-||--|-|-|}
\vz\multirow[c]{3}{=}{\centering B} & & & & & & & & \\
\hhline{|~||--|-|-||--|-|-|}
\hz & C & & & & & & & \\
\hhline{|-||--|-|-||--|-|-|}
\vz\multirow[c]{3}{=}{B} & & & & & & & & \\
\hhline{|~||--|-|-||--|-|-|}
\hz & C & & & & & & & \\
\hhline{|-||--|-|-||--|-|-|}
\vz \hz\multirow[c]{3}{=}{B} & & & & & & & & \\
\hhline{|~||--|-|-||--|-|-|}
\hz & C & & & & & & & \\
\hhline{|*{9}{=}|}
\end{tabularx}
\end{document}