
Я пытаюсь создать прямоугольную сетку (5 строк, 4 столбца) на листе формата А4. Все ячейки имеют размер 5 см на 5 см. Для этого я использую таблицу, как видно из кода. Эту таблицу можно разместить на листе, сдвинув ее немного влево и вверх. Размер ячеек фиксирован и должен оставаться таким независимо от содержимого, которое может быть изображением или несколькими строками текста, созданными с помощью команды \makecell. Моя попытка сделана, но она не работает для высоты ячеек, она постоянно меняется. Что я делаю не так?
С наилучшими пожеланиями, Дмитрий
\documentclass[12pt, a4paper]{article}
\usepackage{amsmath}
\usepackage{pdfpages}
\usepackage{array}
\usepackage{makecell}
\graphicspath{{./}{./Pictures/}}
\renewcommand{\arraystretch}{0}
\renewcommand{\tabcolsep}{0cm}
\begin{document}
\thispagestyle{empty}
\begin{table}
\begin{center}
\vspace*{-2.5cm}
\hspace*{-3.25cm}
\begin{tabular}{|m{5cm}|m{5cm}|m{5cm}|m{5cm}|}
\hline
\centering{\includegraphics[width=4.5cm,height=4.5cm,keepaspectratio]{Stanford_Bunny}} &
\makecell{\textbf{line 1} \\ line 2 \\ line 3 \\ line 4 \\ line 5 \\ line 6} &
\makecell{\textbf{line 1} \\ line 2 \\ line 3 \\ line 4 \\ line 5 \\ line 6} &
\makecell{\textbf{line 1} \\ line 2 \\ line 3 \\ line 4 \\ line 5 \\ line 6}\\[5cm]
\hline
\makecell{\textbf{line 1} \\ line 2 \\ line 3 \\ line 4 \\ line 5 \\ line 6} &
\makecell{\textbf{line 1} \\ line 2 \\ line 3 \\ line 4 \\ line 5 \\ line 6} &
\makecell{\textbf{line 1} \\ line 2 \\ line 3 \\ line 4 \\ line 5 \\ line 6} &
\makecell{\textbf{line 1} \\ line 2 \\ line 3 \\ line 4 \\ line 5 \\ line 6}\\[5cm]
\hline
\makecell{\textbf{line 1}} &
\makecell{\textbf{line 1}} &
\makecell{\textbf{line 1}} &
\makecell{\textbf{line 1}}\\[5cm]
\hline
\makecell{\textbf{line 1} \\ line 2 \\ line 3 \\ line 4 \\ line 5 \\ line 6} &
\makecell{\textbf{line 1} \\ line 2 \\ line 3 \\ line 4 \\ line 5 \\ line 6} &
\makecell{\textbf{line 1} \\ line 2 \\ line 3 \\ line 4 \\ line 5 \\ line 6} &
\makecell{\textbf{line 1} \\ line 2 \\ line 3 \\ line 4 \\ line 5 \\ line 6}\\[5cm]
\hline
\makecell{\textbf{line 1} \\ line 2 \\ line 3 \\ line 4 \\ line 5 \\ line 6} &
\makecell{\textbf{line 1} \\ line 2 \\ line 3 \\ line 4 \\ line 5 \\ line 6} &
\makecell{\textbf{line 1} \\ line 2 \\ line 3 \\ line 4 \\ line 5 \\ line 6} &
\makecell{\textbf{line 1} \\ line 2 \\ line 3 \\ line 4 \\ line 5 \\ line 6}\\[5cm]
\hline
\end{tabular}%
\end{center}
\end{table}
\end{document}
Вывод следующий (последний столбец тоже ведет себя плохо):
решение1
Две возможности
Ниже я описываю два разных решения.
Я включил код для a calstable
в конец ответа, но поскольку вывод для обоих решений одинаков, я не включил изображение результата.
табличный и друзья
Первая возможность — добавить «фантомный» столбец с невидимой вертикальной линейкой 5 см в табличном формате. Я определил новый тип столбца, сделав это. Поскольку у вас есть четыре столбца одинаковой ширины, я также определил их как новый тип столбца. Затем я могу добавить необходимые команды для центрирования содержимого по горизонтали только в одном месте.
Помните, что ширина вашей таблицыне является20 см. Вам нужно прибавить ширину пяти вертикальных линеек (arrayrulewidth
стандартно 0,4 пт,то есть2 pt). Поэтому мне пришлось изменить левое и правое поле вашего MWE, чтобы избавиться от сообщения overfull hbox
. Аналогично и по высоте, это 25 см + 6 arrayrulewidth
.
ИЗМЕНИТЬ 20190807:Чтобы обеспечить вертикальное и горизонтальное центрирование таблицы на странице в зависимости от размера бумаги (а не полей), я заключил таблицу в новую среду, которая основана наОтвет Эндрю Суонна здесь.
Чтобы иметь ровно столько 0.9cm
места между строками, сколько вы упомянули в комментарии, я «схитрила» и добавила двойные вертикальные линии ( \hline\hline
) между строками и увеличила расстояние между двумя линиями до 0.9cm minus two \arrayrulewidth
s. Чтобы избежать пустой первой страницы, я уменьшила все поля документа до 0cm
.
\usepackage[left=0cm,top=0cm,right=0cm,bottom=0cm]{geometry} % Zero margin
\setlength\doublerulesep{\dimexpr(0.9cm-(2\arrayrulewidth))} % Increased space between horizontal rules
Вы заключили свою таблицу в плавающую среду, но этот тип полностраничной таблицы не должен плавать.
\documentclass[12pt, a4paper, demo]{article}
\usepackage{amsmath}
\usepackage{pdfpages}
\usepackage{array, hhline}
\usepackage[left=0cm,top=0cm,right=0cm,bottom=0cm]{geometry}
%% This code is modified from Andrew Swann's code in this answer
%% https://tex.stackexchange.com/a/154736/9632
\newenvironment{preface}{\clearpage\setlength{\topskip}{0pt}%
\newgeometry{margin=0cm,ignoreheadfoot}%
\thispagestyle{empty}%
\centering%
\vspace*{\fill}\nointerlineskip\small}%
{\vspace*{\fill}\clearpage\restoregeometry}
%\graphicspath{{./}{./Pictures/}}
\renewcommand{\arraystretch}{0}
\renewcommand{\tabcolsep}{0cm}
\newcolumntype{M}{>{\centering\arraybackslash}m{5cm}}
\newcolumntype{F}{>{\rule{0pt}{5cm}}m{0pt}}
\begin{document}
\pagestyle{empty}
\begin{preface}
\setlength\doublerulesep{\dimexpr(0.9cm-(2\arrayrulewidth))}
\begin{tabular}{*{4}{|M}|@{}F@{}}
\hline
\includegraphics[width=4.5cm,height=4.5cm,keepaspectratio]{bunny}
&
\textbf{line 1} \par line 2 \par line 3 \par line 4 \par line 5 \par line 6
&
\textbf{line 1} \par line 2 \par line 3 \par line 4 \par line 5 \par line 6
&
\textbf{line 1} \par line 2 \par line 3 \par line 4 \par line 5 \par line 6
&\\
\hline\hline
\textbf{line 1} \par line 2 \par line 3 \par line 4 \par line 5 \par line 6
&
\textbf{line 1} \par line 2 \par line 3 \par line 4 \par line 5 \par line 6
&
\textbf{line 1} \par line 2 \par line 3 \par line 4 \par line 5 \par line 6
&
\textbf{line 1} \par line 2 \par line 3 \par line 4 \par line 5 \par line 6
&\\
\hline\hline
\textbf{line 1}
&
\textbf{line 1}
&
\textbf{line 1}
&
\textbf{line 1}
&\\
\hline\hline
\textbf{line 1} \par line 2 \par line 3 \par line 4 \par line 5 \par line 6
&
\textbf{line 1} \par line 2 \par line 3 \par line 4 \par line 5 \par line 6
&
\textbf{line 1} \par line 2 \par line 3 \par line 4 \par line 5 \par line 6
&
\textbf{line 1} \par line 2 \par line 3 \par line 4 \par line 5 \par line 6
&\\
\hline\hline
\textbf{line 1} \par line 2 \par line 3 \par line 4 \par line 5 \par line 6
&
\textbf{line 1} \par line 2 \par line 3 \par line 4 \par line 5 \par line 6
&
\textbf{line 1} \par line 2 \par line 3 \par line 4 \par line 5 \par line 6
&
\textbf{line 1} \par line 2 \par line 3 \par line 4 \par line 5 \par line 6
&\\
\hline
\end{tabular}\par
\end{preface}
\end{document}
калстабильный
По моему мнению, пакет cals лучше подходит для такого типа таблиц, поскольку в нем очень легко зафиксировать ширину и высоту столбцов и строк. Однако использование 'фантомных' линий также работает в cals.
Расстояние между рядами в 0,9 см легко компенсируется дополнительными рядами такой же высоты.
В cals эта команда \cals@setpadding{<wd>}
эквивалентна tabcolsep
, но она также задает расстояние между строками. Поскольку линии (границы) являются фантомами, я установил отступ на 0.3pt
, что должно привести к ячейкам 5 см x 5 см внутри.
Команды \alignC
центрируют содержимое ячейки по горизонтали и работают до тех пор, пока не будут отключены другой командой выравнивания. \vfil
Центрируют содержимое ячейки по вертикали и могут быть установлены глобально, путем определения команды cals@AtBeginCell
, то есть \def\cals@AtBeginCell{\vfil}
(вы также можете использовать \newcommand*
или \renewcommand*
).
Также взгляните на комментарии в коде.
\documentclass[12pt, a4paper, demo]{article}
\usepackage{amsmath}
\usepackage{pdfpages}
\usepackage{cals}
\usepackage[left=0cm,top=0cm,right=0cm,bottom=0cm]{geometry}
%% This code is modified from Andrew Swann's code in this answer
%% https://tex.stackexchange.com/a/154736/9632
\newenvironment{preface}{\clearpage\setlength{\topskip}{0pt}%
\newgeometry{margin=0cm,ignoreheadfoot}%
\thispagestyle{empty}%
\vspace*{\fill}\nointerlineskip\small}%
{\vspace*{\fill}\clearpage\restoregeometry}
%\graphicspath{{./}{./Pictures/}}
\begin{document}
\pagestyle{empty}
\begin{preface}
\begin{calstable}[c] % Centre the calstable
% Defining 4 equal columns
\colwidths{{5cm}{5cm}{5cm}{5cm}
}
% Set up the tabular
\makeatletter
\def\cals@framers@width{0.3pt} % Outside frame rules, reduce if the rule is too heavy
\def\cals@framecs@width{0.03pt}
\def\cals@bodyrs@width{0.3pt}
\cals@setpadding{0.3pt} % To ensure that the inside of cell is 5 cm
\def\cals@cs@width{0.3pt} % Inside rules, reduce if the rule is too heavy
\def\cals@rs@width{0.3pt}
\def\rb{\ifx\cals@borderR\relax % Right Border 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\cals@AtBeginCell{\vfil} % Vertically centre content of all cell
%\def\cals@AtEndCell{}
%% Start of tabular body, no header row
% R1B1
\brow
\alignC\cell{\includegraphics[width=4.5cm,height=4.5cm,keepaspectratio]{bunny}}
\cell{\textbf{line 1} \par line 2 \par line 3 \par line 4 \par line 5 \par line 6}
\cell{\textbf{line 1} \par line 2 \par line 3 \par line 4 \par line 5 \par line 6}
\cell{\textbf{line 1} \par line 2 \par line 3 \par line 4 \par line 5 \par line 6}
\ht\cals@current@row=5cm
\erow
% R2B1b %% Fore creating space between rows
\brow
\lb\rb\cell{} % \lb&\rb - shortcuts for tuning off left and right border this row
\cell{}
\cell{}
\cell{}\lb\rb % use shortcuts for tuning on left and right border for next row
\ht\cals@current@row=0.9cm
\erow
%R3B2
\brow
\cell{\textbf{line 1} \par line 2 \par line 3 \par line 4 \par line 5 \par line 6}
\cell{\textbf{line 1} \par line 2 \par line 3 \par line 4 \par line 5 \par line 6}
\cell{\textbf{line 1} \par line 2 \par line 3 \par line 4 \par line 5 \par line 6}
\cell{\textbf{line 1} \par line 2 \par line 3 \par line 4 \par line 5 \par line 6}
\ht\cals@current@row=5cm
\erow
% R4B2b
\brow
\lb\rb\cell{}
\cell{}
\cell{}
\cell{}\lb\rb
\ht\cals@current@row=0.9cm
\erow
%R5B3
\brow
\cell{\textbf{line 1}}
\cell{\textbf{line 1}}
\cell{\textbf{line 1}}
\cell{\textbf{line 1}}
\ht\cals@current@row=5cm
\erow
% R6B3b
\brow
\lb\rb\cell{}
\cell{}
\cell{}
\cell{}\lb\rb
\ht\cals@current@row=0.9cm
\erow
%R7B4
\brow
\cell{\textbf{line 1} \par line 2 \par line 3 \par line 4 \par line 5 \par line 6}
\cell{\textbf{line 1} \par line 2 \par line 3 \par line 4 \par line 5 \par line 6}
\cell{\textbf{line 1} \par line 2 \par line 3 \par line 4 \par line 5 \par line 6}
\cell{\textbf{line 1} \par line 2 \par line 3 \par line 4 \par line 5 \par line 6}
\ht\cals@current@row=5cm
\erow
% R8B4b
\brow
\lb\rb\cell{}
\cell{}
\cell{}
\cell{}\lb\rb
\ht\cals@current@row=0.9cm
\erow
%R2B5
\brow
\cell{\textbf{line 1} \par line 2 \par line 3 \par line 4 \par line 5 \par line 6}
\cell{\textbf{line 1} \par line 2 \par line 3 \par line 4 \par line 5 \par line 6}
\cell{\textbf{line 1} \par line 2 \par line 3 \par line 4 \par line 5 \par line 6}
\cell{\textbf{line 1} \par line 2 \par line 3 \par line 4 \par line 5 \par line 6}
\ht\cals@current@row=5cm
\erow
\end{calstable}\par
\end{preface}
\end{document}
решение2
После 11 часов поиска я нашел решение, которым хочу поделиться. Код довольно прост в использовании, а суть заключается в среде мини-страницы внутри таблицы. Обратите внимание, что только использование первого столбца в этой настройке мини-страницы делает свое дело, но я сохранил его для всех ячеек из-за простоты распознавания того, что я сделал позже. Обратите внимание также, что поля «пространства страницы», которые можно использовать, адаптированы для соответствия сетке по желанию. Вероятно, есть более короткие способы сделать этот повторяющийся набор текста на мини-странице, но я не знаю, как это делается. Надеюсь, это будет полезно для кого-то.
С наилучшими пожеланиями, Дмитрий
\documentclass[12pt, a4paper]{article}
\usepackage{amsmath}
\usepackage{pdfpages}
\usepackage{array}
\usepackage{makecell}
\usepackage[export]{adjustbox}
\usepackage[left=0.5cm,top=2.35cm,right=0.5cm,bottom=2.35cm]{geometry}
\graphicspath{{./}{./Pictures/}}
\renewcommand{\arraystretch}{0}
\renewcommand{\tabcolsep}{0cm}
\begin{document}
\pagestyle{empty}
\begin{table}[h!]
\begin{tabular}{|m{5cm}|m{5cm}|m{5cm}|m{5cm}|}
\hline
\begin{minipage}[c][5cm][c]{5cm}
\begin{center}
\includegraphics[width=4.5cm,height=4.5cm,keepaspectratio]{Bunny}
\end{center}
\end{minipage} &
\begin{minipage}[c][5cm][c]{5cm}
\begin{center}
\makecell{\textbf{line 1} \\ line 2 \\ line 3 \\ line 4 \\ line 5 \\ line 6}
\end{center}
\end{minipage} &
\begin{minipage}[c][5cm][c]{5cm}
\begin{center}
\makecell{\textbf{line 1} \\ line 2 \\ line 3 \\ line 4 \\ line 5 \\ line 6}
\end{center}
\end{minipage} &
\begin{minipage}[c][5cm][c]{5cm}
\begin{center}
\makecell{\textbf{line 1} \\ line 2 \\ line 3 \\ line 4 \\ line 5 \\ line 6}
\end{center}
\end{minipage}\\
\hline
\begin{minipage}[c][5cm][c]{5cm}
\begin{center}
\makecell{\textbf{line 1} \\ line 2 \\ line 3 \\ line 4 \\ line 5 \\ line 6}
\end{center}
\end{minipage} &
\begin{minipage}[c][5cm][c]{5cm}
\begin{center}
\makecell{\textbf{line 1} \\ line 2 \\ line 3 \\ line 4 \\ line 5 \\ line 6}
\end{center}
\end{minipage} &
\begin{minipage}[c][5cm][c]{5cm}
\begin{center}
\makecell{\textbf{line 1} \\ line 2 \\ line 3 \\ line 4 \\ line 5 \\ line 6}
\end{center}
\end{minipage} &
\begin{minipage}[c][5cm][c]{5cm}
\begin{center}
\makecell{\textbf{line 1} \\ line 2 \\ line 3 \\ line 4 \\ line 5 \\ line 6}
\end{center}
\end{minipage}\\
\hline
\begin{minipage}[c][5cm][c]{5cm}
\begin{center}
\makecell{\textbf{line 1}}
\end{center}
\end{minipage} &
\begin{minipage}[c][5cm][c]{5cm}
\begin{center}
\makecell{\textbf{line 1}}
\end{center}
\end{minipage} &
\begin{minipage}[c][5cm][c]{5cm}
\begin{center}
\makecell{\textbf{line 1}}
\end{center}
\end{minipage} &
\begin{minipage}[c][5cm][c]{5cm}
\begin{center}
\makecell{\textbf{line 1}}
\end{center}
\end{minipage}\\
\hline
\begin{minipage}[c][5cm][c]{5cm}
\begin{center}
\makecell{\textbf{line 1} \\ line 2 \\ line 3 \\ line 4 \\ line 5 \\ line 6}
\end{center}
\end{minipage} &
\begin{minipage}[c][5cm][c]{5cm}
\begin{center}
\makecell{\textbf{line 1} \\ line 2 \\ line 3 \\ line 4 \\ line 5 \\ line 6}
\end{center}
\end{minipage} &
\begin{minipage}[c][5cm][c]{5cm}
\begin{center}
\makecell{\textbf{line 1} \\ line 2 \\ line 3 \\ line 4 \\ line 5 \\ line 6}
\end{center}
\end{minipage} &
\begin{minipage}[c][5cm][c]{5cm}
\begin{center}
\makecell{\textbf{line 1} \\ line 2 \\ line 3 \\ line 4 \\ line 5 \\ line 6}
\end{center}
\end{minipage}\\
\hline
\begin{minipage}[c][5cm][c]{5cm}
\begin{center}
\makecell{\textbf{line 1} \\ line 2 \\ line 3 \\ line 4 \\ line 5 \\ line 6}
\end{center}
\end{minipage} &
\begin{minipage}[c][5cm][c]{5cm}
\begin{center}
\makecell{\textbf{line 1} \\ line 2 \\ line 3 \\ line 4 \\ line 5 \\ line 6}
\end{center}
\end{minipage} &
\begin{minipage}[c][5cm][c]{5cm}
\begin{center}
\makecell{\textbf{line 1} \\ line 2 \\ line 3 \\ line 4 \\ line 5 \\ line 6}
\end{center}
\end{minipage} &
\begin{minipage}[c][5cm][c]{5cm}
\begin{center}
\makecell{\textbf{line 1} \\ line 2 \\ line 3 \\ line 4 \\ line 5 \\ line 6}
\end{center}
\end{minipage}\\
\hline
\end{tabular}
\end{table}
\end{document}
Вывод теперь выглядит следующим образом: