grade com células quadradas de tamanho fixo independente do conteúdo

grade com células quadradas de tamanho fixo independente do conteúdo

Estou tentando fazer uma grade retangular (5 linhas, 4 colunas) em papel A4. Todas as células têm a dimensão de 5cm por 5cm. Para isso utilizo uma tabela como pode ser visto no código. Esta mesa pode caber no papel, deslocando-a um pouco para a esquerda e para cima. O tamanho das células é fixo e deve permanecer assim independente do conteúdo que pode ser uma imagem ou várias linhas de texto criadas usando o comando \makecell. Minha tentativa é dada mas não funciona para a altura das células, isso vai mudando. O que estou fazendo de errado?

cumprimentos, Dimitri

\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}

A saída é a seguinte (a última coluna também está se comportando mal):

exemplo

Responder1

Duas possibilidades

Abaixo, descrevo duas soluções diferentes

  1. Usando tabular,variedade,hhlineetc.
  2. Usando o pacotechamadas

Incluí o código a calstableno final da resposta, mas como a saída é a mesma para ambas as soluções, não incluí uma imagem do resultado.

tabular e amigos

A primeira possibilidade é adicionar uma coluna 'fantasma' com uma régua vertical invisível de 5 cm em uma tabela. Eu defini um novo tipo de coluna fazendo isso. Como você tem quatro colunas de largura igual, também as defini como um novo tipo de coluna. Então posso adicionar os comandos necessários para centralizar o conteúdo horizontalmente em apenas um lugar.

Esteja ciente de que a largura da sua tabelanão é20 cm. Você deve adicionar a largura das cinco réguas verticais ( arrayrulewidtho padrão é 0,4pt,ou seja2 pontos). Portanto, tive que alterar a margem esquerda e direita do seu MWE para me livrar de uma overfull hboxmensagem. É semelhante para a altura, é 25 cm + 6 arrayrulewidth.

EDITAR 20190807:Para garantir que a tabela esteja centralizada vertical e horizontalmente na página com base no tamanho do papel (não nas margens), incluí a tabela em um novo ambiente, que é baseado emA resposta de Andrew Swann aqui.

Para ter exatamente 0.9cmo espaço entre as linhas, que você mencionou em um comentário, eu 'trapaceei' e adicionei regras verticais duplas ( \hline\hline) entre as linhas e aumentei o espaço entre as duas regras para 0.9cm minus two \arrayrulewidths. Para evitar uma primeira página em branco, diminuí todas as margens do documento para 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

Você incluiu sua tabela em um ambiente flutuante, mas esse tipo de tabela de página inteira não deve flutuar.

insira a descrição da imagem aqui

\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}

caltável

Na minha opinião, o pacote cals é mais adequado para esse tipo de tabela porque é muito fácil fixar a largura e a altura das colunas e linhas. No entanto, usar linhas 'fantasmas' também funciona em cals.

O espaço de 0,9 cm entre linhas é facilmente corrigido por linhas adicionais dessa altura.

Em cals, o comando \cals@setpadding{<wd>}equivale a tabcolsep, mas também define a distância entre as linhas. Como as regras (bordas) são fantasmas, defini o preenchimento como 0.3pt, o que deve resultar em células de 5cmx5cm no interior.

Os comandos \alignCcentralizam o conteúdo da célula horizontalmente e funcionam até que sejam desligados por outro comando de alinhamento. \vfilcentraliza o conteúdo da célula verticalmente e pode ser definido globalmente definindo o comando cals@AtBeginCell, ou seja \def\cals@AtBeginCell{\vfil}(você também pode usar \newcommand*ou \renewcommand*).

Também dê uma olhada nos comentários no código.

\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}

Responder2

Após 11 horas de pesquisa obtive uma solução que gostaria de compartilhar. O código é bastante fácil de seguir e a essência é um ambiente de minipágina dentro de uma tabela. Observe que usar apenas a primeira coluna nesta configuração de minipágina resolve, mas eu a mantive para todas as células devido à facilidade de reconhecer o que fiz mais tarde. Observe também que as margens do "pagespace" que podem ser utilizadas são adaptadas para caber na grade conforme desejado. Presumivelmente, existem maneiras mais curtas de fazer essa digitação repetida de minipáginas, mas não sei como isso é feito. Espero que isso seja útil para alguém.

cumprimentos, Dimitri

\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}

A saída agora é a seguinte:

insira a descrição da imagem aqui

informação relacionada