如何调整表格中换行文本横向列标题的宽度和段落单元格的宽度

如何调整表格中换行文本横向列标题的宽度和段落单元格的宽度

我正在尝试在 Texmaker 中创建如下表。

在此处输入图片描述

这里我面临以下问题。

  1. 将第 4 至第 6 列标题换行并居中对齐。
  2. 段落 [第 3 行最后一列] 上的 Hspace 不起作用
  3. 最后的多行包含来自其前一行的元素。

屏幕截图如下。问题突出显示红色的盒子

在此处输入图片描述

以下是完整的代码...请帮我解决这些问题。


\documentclass[12pt,a4paper,titlepage]{report}
\usepackage{array}
\usepackage{booktabs, multicol, multirow}
\usepackage{color, textcomp, listings}
\usepackage{rotating}
\usepackage[table]{xcolor}
\usepackage{pbox}

\begin{document}
% Table generated by Excel2LaTeX from sheet 'All Exp Table'
\begin{table}[!htbp]
  \centering
      \renewcommand\baselinestretch{1}\normalsize
      \renewcommand{\arraystretch}{1.2}
    \begin{tabular}{|c|c|c|m{.5 cm}|m {.5 cm}|m{.5 cm}|m {10.5 cm}|}
\hline
    {\begin{sideways} {\centering { Rule No} } \end{sideways}}& {\begin{sideways} {\centering { F\_offsetFlag } } \end{sideways}} & {\begin{sideways} {\centering { B\_offsetFlag } } \end{sideways}} &      \multicolumn{1}{m {.5 cm}}{\begin{sideways} { F\_offsetDiff Relation  MaxBlkSize} \end{sideways}} & 
\multicolumn{1}{m {.5 cm}}{\begin{sideways} { B\_offsetDiff (Relation) MaxBlkSize} \end{sideways}} &
\multicolumn{1}{m {.5 cm}}{\begin{sideways} { F\_offsetDiff (Relation) B\_offsetDiff } \end{sideways}} &  {\textbf{Action}} \\     \hline
    1     & F     & F     & $<$     &  & =     & \pbox{10 cm}{writeBlockAndUpdateOffsets(f\_buf,f\_hash,null);} \\ \hline
    2     & F     & F     & =     & {} & $>$     & \multicolumn{1}{l} { \pbox{10 cm}{If (hasBlockHashOnHBase(next\_b\_hash)) \\ \hspace{1 cm} byte[] buf = Arrays.copyOfRange(f\_buf, 0, (int)(b\_offset-offset)); \\ \hspace{1 cm} recordBlockAndUpdateOffsets(buf,null,null); \\
Else \\ WriteBlockAndUpdateOffsets(f\_buf,f\_hash,null); } }\\ \hline
    3     & F     & F     &       & = & =     & \multicolumn{1}{l}{\multirow{2}[4]{*}{writeBlockAndUpdateOffsets(b\_buf,b\_hash,null);}} \\ \cline{1-6}
    4     & F     & F     &       & {=} & $>$     & \multicolumn{1}{l}{} \\ \hline
    5     & F     & T     &       & {$<$} & =     & \pbox{10 cm}{byte[] buf = Arrays.copyOfRange(b\_buf, (maxBlockSize-lastBlkSize), b\_buf.length); \\
recordSuperBlockAndUpdateOffsets (buf,null,b\_hash+","+(maxBlockSize-lastBlkSize)+","+buf.length);} \\ \hline
    6     & F     & T     &       & {$<$} &       & \pbox{10 cm}{If (offset==0)\\
   IncrementBlockAndUpdateOffsets(b\_hash,b\_BlkSize);\\
Else\\
   byte[] buf = Arrays.copyOfRange(b\_buf, (maxBlockSize-lastBlkSize), b\_buf.length);\\
   recordSuperBlockAndUpdateOffsets(buf,null,b\_hash+","+ (maxBlockSize-lastBlkSize)+","+buf.length); } \\ \hline

    9     & T     & F     & $<$     & {} & =     & \multicolumn{1}{l}{\multirow{2}[4]{*}{incrementBlockAndUpdateOffsets(f\_hash,f\_BlkSize);}} \\ \cline{1-6}
    10    & T     & F     & =     & {} &       & \multicolumn{1}{l}{} \\ \hline
    11    & T     & F     & =     & {} & =     & \multicolumn{1}{l}{\multirow{2}[4]{10 cm}{{byte[] buf = Arrays.copyOfRange(b\_buf, 0, (maxBlockSize-lastBlkSize));\\ recordBlockAndUpdateOffsets(buf,null,null);\\ incrementBlockAndUpdateOffsets(f\_hash,f\_BlkSize);}}} \\ \cline{1-6}
    12    & T     & F     & $>$     & {} &       & \multicolumn{1}{l}{} \\ \hline
    13    & T     & T     & $<$     & {} & =     & \multicolumn{1}{l}{\multirow{2}[4]{*}{incrementBlockAndUpdateOffsets(f\_hash,f\_BlkSize);}} \\ \cline{1-6}
    14    & T     & T     & =     & {} & $>$     & \multicolumn{1}{l}{} \\ \hline
    \end{tabular}%
\caption{}
  \label{tab:ImplLogic2}%
\end{table}%
\end{document}

答案1

这里有很多问题。

首先要说明的是:使用时\multicolumn记得包含所需的任何规则,例如,写成\multicolumn{1}{c|}{...}而不是简单的c。如果没有 ,|垂直线就会有洞。

对于旋转的标签,最好将它们全部视为相同。您的前 6 列都可以是 类型c。现在需要将标签置于框的中心并进行旋转。最简单的方法是在旋转之前使所有这些框的宽度固定,这样就会应用相同的居中方式。所以我的建议是创建一个通用的方法来执行所有这些操作,并引入一个您可以调整的长度。以下命令\sidewaysc可以简单地用作\sidewaysc{Text\\ text}

\newlength{\sidewaysclen}
\setlength{\sidewaysclen}{6em}

\newcommand{\sidewaysc}[1]{\raisebox{\dimexpr-0.5\sidewaysclen}{%
  \begin{sideways}\begin{minipage}{\sidewaysclen}%
    \centering #1\end{minipage}\end{sideways}}}

环境sideways将盒子旋转一个角,对于您的桌子,最好将其向下移动,\raisebox以便它位于线上的中心。

缺少的\hspaces 是由于隐式使用了封闭环境。它本质上是一个段落,如果在段落中指定换行符,LaTeX 将忽略下一行开头的空格。有几种方法可以解决这个问题。如果将材料打包在 a 中\parbox并指定,\raggedright那么\hspaces 将被尊重。我建议您使用\quad\qquad对于这些空格,它们等于\hspace{1em}\hspace{2em},但更容易一致地使用。顺便说一下,\multirow具有指定宽度的 a 已经以这种方式用 打包了它的参数\raggedright(至少在默认设置中),因此在那里这种间距是值得尊重的。在下面的例子中,我引入了一个长度变量来指定最后一列的宽度,并且在每次需要在该列中指定\parbox\multirow宽度时使用它。

最后,底部的“重复”文本与\multirow表格的下一行重叠。该\multirow命令不会提供所需的垂直空间,因此您应该加宽相应的行,例如使用\\[dimension]。在您的情况下,您希望在两个连续的行上均匀地执行此操作,这\\[4ex]似乎是正确的。

示例输出

\documentclass[12pt,a4paper]{report}

\usepackage{array}
\usepackage{multirow}
\usepackage{rotating}
\usepackage{adjustbox}

\newlength{\sidewaysclen}
\setlength{\sidewaysclen}{6em}
\newcommand{\sidewaysc}[1]{\raisebox{\dimexpr-0.5\sidewaysclen}{%
  \begin{sideways}\begin{minipage}{\sidewaysclen}%
    \centering #1\end{minipage}\end{sideways}}}
\newlength{\finalcolwd}

\begin{document}

\begin{table}[htp]
  \centering
  \renewcommand\baselinestretch{1}\normalsize
  \renewcommand{\arraystretch}{1.2}
  \setlength{\sidewaysclen}{6em}
  \setlength{\finalcolwd}{8.8cm}
  \begin{adjustbox}{center}
  \begin{tabular}{|c|c|c|c|c|c|m{\finalcolwd}|}
    \hline
    \sidewaysc{Rule No}&\sidewaysc{F\_offsetFlag}&
    \sidewaysc{B\_offsetFlag}&
    \sidewaysc{F\_offsetDiff\\ Relation\\ MaxBlkSize}& 
    \sidewaysc{B\_offsetDiff\\ (Relation)\\ MaxBlkSize}&
    \sidewaysc{F\_offsetDiff\\ (Relation)\\ B\_offsetDiff}&
    \multicolumn{1}{c|}{\textbf{Action}}
    \\ \hline
    1     & F     & F     & $<$     &  & =     &
    writeBlockAndUpdateOffsets(f\_buf,f\_hash,null);
    \\ \hline
    2     & F     & F     & =     &  & $>$     & 
    \parbox{\finalcolwd}{\raggedright\strut
    If (hasBlockHashOnHBase(next\_b\_hash))\\
      \quad  byte[] buf = Arrays.copyOfRange(f\_buf, 0,\\
      \qquad (int)(b\_offset-offset));\\
      \quad  recordBlockAndUpdateOffsets(buf,null,null); \\
      Else\\
      \quad  WriteBlockAndUpdateOffsets(f\_buf,\\
      \qquad f\_hash,null);\strut}
    \\ \hline
    3     & F     & F     &       & = & =     &
    \multirow{2}{*}{writeBlockAndUpdateOffsets(b\_buf,b\_hash,null);}
    \\ \cline{1-6} 
    4     & F     & F     &       & = & $>$     &
    \\ \hline
    11    & T     & F     & =     &  & = &
    \multirow{2}{\finalcolwd}[-3pt]{%
      byte[] buf = Arrays.copyOfRange(b\_buf, 0,\\
      \quad (maxBlockSize-lastBlkSize));\\
      recordBlockAndUpdateOffsets(buf,null,null);\\
      incrementBlockAndUpdateOffsets\\
      \quad (f\_hash,f\_BlkSize);}
    \\[4ex] \cline{1-6}
    12    & T     & F     & $>$     &  &       &
    \\[4ex] \hline
    13    & T     & T     & $<$     &  & =     &
    \multirow{2}{\finalcolwd}{%
      incrementBlockAndUpdateOffsets\\
      \quad(f\_hash,f\_BlkSize);} 
    \\ \cline{1-6}
    14    & T     & T     & =     &  & $>$     & \\ \hline
  \end{tabular}
  \end{adjustbox}
  \caption{Example table}
  \label{tab:ImplLogic2}%
\end{table}%
\end{document}

桌子很宽,所以我把它放在一个adjust盒子里,这样它就可以均匀地伸出到两个边缘。

相关内容