сетка с квадратными ячейками фиксированного размера, независимо от содержимого

сетка с квадратными ячейками фиксированного размера, независимо от содержимого

Я пытаюсь создать прямоугольную сетку (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

Две возможности

Ниже я описываю два разных решения.

  1. Используя табличный,множество,hhlineи т. д.
  2. Использование пакетакал

Я включил код для a calstableв конец ответа, но поскольку вывод для обоих решений одинаков, я не включил изображение результата.

табличный и друзья

Первая возможность — добавить «фантомный» столбец с невидимой вертикальной линейкой 5 см в табличном формате. Я определил новый тип столбца, сделав это. Поскольку у вас есть четыре столбца одинаковой ширины, я также определил их как новый тип столбца. Затем я могу добавить необходимые команды для центрирования содержимого по горизонтали только в одном месте.

Помните, что ширина вашей таблицыне является20 см. Вам нужно прибавить ширину пяти вертикальных линеек (arrayrulewidth стандартно 0,4 пт,то есть2 pt). Поэтому мне пришлось изменить левое и правое поле вашего MWE, чтобы избавиться от сообщения overfull hbox. Аналогично и по высоте, это 25 см + 6 arrayrulewidth.

ИЗМЕНИТЬ 20190807:Чтобы обеспечить вертикальное и горизонтальное центрирование таблицы на странице в зависимости от размера бумаги (а не полей), я заключил таблицу в новую среду, которая основана наОтвет Эндрю Суонна здесь.

Чтобы иметь ровно столько 0.9cmместа между строками, сколько вы упомянули в комментарии, я «схитрила» и добавила двойные вертикальные линии ( \hline\hline) между строками и увеличила расстояние между двумя линиями до 0.9cm minus two \arrayrulewidths. Чтобы избежать пустой первой страницы, я уменьшила все поля документа до 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}

Вывод теперь выглядит следующим образом:

введите описание изображения здесь

Связанный контент