有哪些好的方法可以在表格单元格内强制换行同时保持正确的格式?

有哪些好的方法可以在表格单元格内强制换行同时保持正确的格式?

我研究了以下线程中提供的有关如何在表格单元格内强制换行的一些不同的解决方案:

如何在表格单元格内添加强制换行符

基于此,我编制了一个包含一些建议的换行方法的表格,以查看它们如何与我在序言中列出的表格格式相互作用:

\documentclass{article}

\usepackage{graphicx} % Required for inserting images

\usepackage[left=2cm, right=2cm, top=2cm, bottom=2cm]{geometry}

% Must have features for my tables

\usepackage{array}

\setlength{\tabcolsep}{18pt}

\setlength{\arrayrulewidth}{0.5mm}

\renewcommand{\arraystretch}{1.5}

% ________________________________

\usepackage[usestackEOL]{stackengine} 
% Package for \strutlongstacks{T} forced linebreak method

\usepackage{makecell}
% Package for \makecell forced linebreak method

\begin{document}

\begin{table}[h]

    \centering
    \strutlongstacks{T}
    \begin{tabular}{|c|c|m{3cm}|}
        \hline
        \multicolumn{3}{|c|}{Calender for the rest of the year} \\
        \hline
        \textbf{Date} & \textbf{Homework} & \textbf{Goal}  \\
        \hline
        Week 1 & Homework 1 and 2 & \begin{tabular}[c]{@{}c@{}}Goal for 1 is to... \\ Goal for 2 is to... \end{tabular} \\ % Text exceeds cell when limit is reached
        \hline
        Week 2 & Homework 3 and 4 & \vtop{\hbox{\strut Goal for 3 is to...}\hbox{\strut Goal for 4 is to...}} \\ % Force elongates cell on itself when limit is exceeded
        \hline
        Week 3 & Homework 5 and 6 & \Centerstack{Goal for 5 is to... \\ Goal for 6 is to...} \\ % Text exceeds cell when limit is reached
        \hline
        Week 4 & Homework 7 and 8 & \begin{flushleft} Goal for 7 is to... \\ Goal for 8 is to... \end{flushleft} \\ % Works for long text, too, only for column types of "|m{}|", though, not for regular "|c|"
        \hline
        Week 5 & Homework 9 and 10 & \parbox{3cm}{Goal for 9 is to... \\ Goal for 10 is to...} \\ % Works but completely ignores the \renewcommand{\arraystretch}{1.5} in the preamble
        \hline
        Week 6 & Homework 11 and 12 & \makecell{Goal for 11 is to... \\ Goal for 12 is to...} \\ % Text exceeds cell when limit is reached
        \hline
    \end{tabular}
    \caption{Caption}
    \label{tab:my_label}
\end{table}

\end{document}

您可以在这里看到它在输出端的样子: 代码的可视化表示

我喜欢目标 1 和 2 的显示方式,并且它补充了我在序言中的设置,因此我理想情况下希望它可以被修改,以便当我m{3cm}在第三列中使用时,第二列仍然居中,就像家庭作业 7 和 8 一样,并且当文本超出提供给单元格的限制时也会自动换行。

如果你们能想到任何方法来优化其中任何一个以使其格式正确,或者想出新的创造性方法,那么如果您在这里分享它们,我们将不胜感激:)

答案1

据我了解,您的问题是获得固定大小的、垂直居中的多行列。

你可以在 中使用固定大小\makecell。例如:

\makecell[c{p{3cm}}]{Goal for 1 is to... \\ Goal for 2 is to...}

将创建一个垂直居中的单元格,其固定宽度为3cm。对于您的情况,由于宽度是在列规范中设置的,因此将其替换3cm\hsize(它将采用列的 )。但要获得正确的垂直位置,您必须让\makecell处理它并在列规范中使用p{3cm}而不是。m{3cm}

同时添加

\renewcommand{\cellset}{\def\arraytretch{1.5}}%

如果您想要更大的内部空间\makecell

完整示例:

\documentclass{article}

\usepackage{graphicx} % Required for inserting images

\usepackage[left=2cm, right=2cm, top=2cm, bottom=2cm]{geometry}

% Must have features for my tables

\usepackage{array}
\usepackage{makecell}

\setlength{\tabcolsep}{18pt}
\setlength{\arrayrulewidth}{0.5mm}
\renewcommand{\arraystretch}{1.5}
\renewcommand{\cellset}{\def\arraytretch{1.5}}%

\begin{document}

\begin{table}[h]

  \centering
  \begin{tabular}{|c|c|p{3cm}|}
    \hline
    \multicolumn{3}{|c|}{Calender for the rest of the year}                                 \\
    \hline
    \textbf{Date}   & \textbf{Homework} & \textbf{Goal}                                                                \\
    \hline
    \hline
    Week 1 & Homework 1 and 2
           & \makecell[c{p{\hsize}}]{Goal for 1 is to... lot of things that take many lines \\
             Goal for 2 is to... lot of things that take many lines}                        \\
    \hline
    Week 2 & Homework 3 and 4
           & \makecell[c{p{\hsize}}]{Goal for 3 is to... lot of things that take many lines \\
             Goal for 4 is to... lot of things that take many lines}                        \\
    \hline
    Week 3 & Homework 5 and 6
           & \makecell[c{p{\hsize}}]{Goal for 5 is to... lot of things that take many lines \\
             Goal for 6 is to... lot of things that take many lines}                                     \\
     \hline
  \end{tabular}
  \caption{With \textsf{makecell}}
  \label{tab:my_label}
\end{table}

\end{document}

使用 makecell

无论如何,现在表格数组包,它通过现代键值接口为表格提供许多自定义功能,并复制了经典表格包的功能。使用,设置宽度tabularray为 的垂直居中列(是 使用的列说明符),并使用括号简单地获得多行单元格:3cmQ[3cm,m]Qtabularray

Week 1 & Homework 1 and 2  & {Goal for 1 is to...\\  Goal for 2 is to...} \\

示例(看一下它如何更清晰,格式和内容分开):

\documentclass{article}

\usepackage{graphicx} % Required for inserting images

\usepackage[left=2cm, right=2cm, top=2cm, bottom=2cm]{geometry}

% Must have features for my tables

\usepackage{tabularray}

\begin{document}

\begin{table}[h]
  \centering
  \begin{tblr}
    {
      colspec={ | Q[c,m] | Q[c,m] | Q[3cm,m] |},
      hline{1-Z} = {1}{-}{0.5mm, solid},
      hline{3} = {2}{-}{0.5mm, solid},
      vlines={0.5mm},
      row{2} = {font=\bfseries},
      colsep=18pt,
      stretch=1.5,
    }
    \SetCell[c=3]{c} Calender for the rest of the year
    \\
    Date   & Homework & Goal
    \\
    Week 1 & Homework 1 and 2
    & {Goal for 1 is to... lot of things that take many lines \\[6pt]
      Goal for 2 is to... lot of things that take many lines}
    \\
    Week 2 & Homework 3 and 4
    & {Goal for 3 is to... lot of things that take many lines \\[6pt]
      Goal for 4 is to... lot of things that take many lines}
    \\
    Week 3 & Homework 5 and 6
    & {Goal for 5 is to... lot of things that take many lines   \\[6pt]
      Goal for 6 is to... lot of things that take many lines}
  \end{tblr}
  \caption{With \textsf{tabularray}}
  \label{tab:my_label}
\end{table}

\end{document}

使用 tabularray

答案2

我认为你不需要任何花哨的东西......除了为了\tabularnewline结束行,因为\\在最后一列。

\documentclass{article}

\usepackage[left=2cm, right=2cm, top=2cm, bottom=2cm]{geometry}
\usepackage{array}

\begin{document}

\begin{table}[htp]
\centering
\renewcommand{\arraystretch}{1.5}

\begin{tabular}{|c|c|>{\raggedright}m{5cm}|}
\hline
\multicolumn{3}{|c|}{Calendar for the rest of the year} \tabularnewline
\hline
\textbf{Date} & \textbf{Homework} & \multicolumn{1}{c|}{\textbf{Goal}}  \tabularnewline
\hline
Week 1 & Homework 1 and 2 &
  Goal for 1 is to... lot of things that take many lines \\[6pt]
  Goal for 2 is to... lot of things that take many lines \tabularnewline
\hline
Week 2 & Homework 3 and 4 &
  Goal for 3 is to... lot of things that take many lines \\[6pt]
  Goal for 4 is to... lot of things that take many lines \tabularnewline
\hline
Week 3 & Homework 5 and 6 &
  Goal for 5 is to... lot of things that take many lines \\[6pt]
  Goal for 6 is to... lot of things that take many lines
  Goal for 1 is to... \tabularnewline
\hline
\end{tabular}

\caption{Caption}
\label{tab:my_label}

\end{table}

\end{document}

在此处输入图片描述

替代布局:

\documentclass{article}

\usepackage[left=2cm, right=2cm, top=2cm, bottom=2cm]{geometry}
\usepackage{array,booktabs}

\begin{document}

\begin{table}[htp]
\centering

\begin{tabular}{@{}cc>{\raggedright}p{5cm}@{}}
\toprule
\multicolumn{3}{c}{Calendar for the rest of the year} \tabularnewline
\midrule
\textbf{Date} & \textbf{Homework} & \multicolumn{1}{c}{\textbf{Goal}}  \tabularnewline
\midrule
Week 1 & Homework 1 and 2 &
  Goal for 1 is to... lot of things that take many lines \\[6pt]
  Goal for 2 is to... lot of things that take many lines \tabularnewline
\addlinespace
Week 2 & Homework 3 and 4 &
  Goal for 3 is to... lot of things that take many lines \\[6pt]
  Goal for 4 is to... lot of things that take many lines \tabularnewline
\addlinespace
Week 3 & Homework 5 and 6 &
  Goal for 5 is to... lot of things that take many lines \\[6pt]
  Goal for 6 is to... lot of things that take many lines
  Goal for 1 is to... \tabularnewline
\bottomrule
\end{tabular}

\caption{Caption}
\label{tab:my_label}

\end{table}

\end{document}

在此处输入图片描述

相关内容