如何使用 \multirow 在 \longtable 的下一页上重复单元格内容

如何使用 \multirow 在 \longtable 的下一页上重复单元格内容

我创建了一个 LaTEX 文档,其中包含多个使用长表跨越多页的大表格。表格中有多个主题(第 1 列)和主题(第 2 列)。问题是,在第二页上,第 1 列是空的,但子主题在第 2 列中列出得很好。您能告诉我如何将“主题 1”也放到第 2 页上吗?

以下是一些示例代码:

\documentclass[11pt]{article}
\usepackage{lipsum} % for dummy text only
\usepackage{multirow}
\usepackage{longtable}%Setup to allow tables to span multiple pages and repeat headers on 
                      %next page 
\setlength{\arrayrulewidth}{1.2pt}% Set all table lines thicker than their 0.4pt default

%--------------------Setup Margins ---------------------
\textheight 9in
\usepackage[hmargin=2cm,vmargin=4cm]{geometry}
\setlength{\headsep}{1pt}
\setlength{\footskip}{25pt} % 25pts

\begin{document}
\begin{centering}
    \begin{longtable}{|p{3.2cm}|p{2.3cm}|p{10.5cm}|} \hline 
         \endfoot % force a footer here 
        \hline
        \bf{Head 1} & \bf{Head 2} & \bf{Head 3}\\[5ex]   \hline \endhead

 \multirow{3}{*}{Topic 1}
&Subtopic A  & There is some text here but could be small   \\ \cline{2-3}
 & Subtopic B & \lipsum[1-3]  \\  \cline{2-3}
 &  Subtopic C & \lipsum[1-2]   \\  \cline{2-3}
 \hline
 \multirow{3}{*}{Topic 2}
 &Subtopic A  & \lipsum[1-3]   \\ \cline{2-3}
 & Subtopic B & \lipsum[1-2]  \\  \cline{2-3}
 &  Subtopic C & \lipsum[1-2]   \\  \cline{2-3}
 \hline
    \end{longtable}
 \end{centering}
\end{document}

答案1

以下示例实现了以下逻辑:每个子主题都有一个主题。如果同一页面上某个主题的子主题位于同一主题的子主题之后,则该主题将被隐藏。这意味着,如果需要,该主题将在新页面上的第一个子主题中重复出现。

第一列中的每个主题都由 设置\topic{...}。重复的主题可以用 缩写\lasttopic。可以通过重新定义 来更改主题的格式\topicformat

\documentclass[11pt]{article}
\usepackage{lipsum} % for dummy text only
\usepackage{longtable}
\setlength{\arrayrulewidth}{1.2pt}

\usepackage[
  hmargin=2cm,
  vmargin=4cm,
  headsep=1pt,
  footskip=25pt,
]{geometry}

\usepackage{zref-abspage}[2010/03/26]

\makeatletter
% Counter `topic@label' for automatic generation of label names
\newcounter{topic@label}
\renewcommand*{\thetopic@label}{topic@\the\value{topic@label}}

% \topic@previous: Macro for remembering the previous topic
\global\let\topic@previous\relax
\global\let\lasttopic\relax
\newcommand*{\topic}[1]{%
  \begingroup
    \def\topic@put{\topicformat{#1}}%
    % Remember label name of previous topic
    \edef\topic@previouslabel{\thetopic@label}%
    % Set label to remember the page position
    \stepcounter{topic@label}%
    \zref@labelbyprops{\thetopic@label}{abspage}%
    % Compare topic with previous topic
    \def\topic@current{#1}%
    \ifx\topic@current\topic@previous
      % Check, whether is the previous topic with same name is
      % on the same page.
      \zifrefundefined{\topic@previouslabel}{%
        \topic@put
      }{%
        \zifrefundefined{\thetopic@label}{%
          \topic@put
        }{%
          \ifnum\zref@extractdefault{\topic@previouslabel}{abspage}{0}=%
                \zref@extractdefault{\thetopic@label}{abspage}\relax
          \else
            \topic@put
          \fi
        }%
      }%
    \else
      % New topic is always set
      \topic@put
    \fi
    % Remember this topic as previous topic for next topic
    \global\let\topic@previous\topic@current
  \endgroup
  \gdef\lasttopic{\topic{#1}}%
}
% Macro \topicformat formats the topic
\newcommand*{\topicformat}[1]{#1}
\makeatother

\begin{document}
\begin{longtable}{|p{3.2cm}|p{2.3cm}|p{10.5cm}|}
  \hline
\endfoot
  \hline
  \bfseries Head 1 & \bfseries Head 2 & \bfseries Head 3\\[5ex]
  \hline
\endhead
  \topic{Topic 1}
    & Subtopic A  & There is some text here but could be small \\ \cline{2-3}
  \lasttopic
    & Subtopic B & \lipsum[1-3]  \\  \cline{2-3}
  \lasttopic
    & Subtopic C & \lipsum[1-2]   \\  \cline{2-3}
  \hline
  \topic{Topic 2}
    & Subtopic A  & \lipsum[1-3]   \\ \cline{2-3}
  \lasttopic
    & Subtopic B & \lipsum[1-2]  \\  \cline{2-3}
  \lasttopic
    &  Subtopic C & \lipsum[1-2]   \\  \cline{2-3}
  \hline
\end{longtable}
\end{document}

结果

评论:

  • 的设置\textheight将被通过 的页面布局设置覆盖geometry
  • \bf已过时(LaTeX2.09),LaTeX(LaTeX2e)使用\bfseries\textbf\bf和都\bfseries没有参数。 该设置在当前组(本例中为表格单元格)结束前有效。
  • center是环境,\centering是命令。在这种情况下,两者都不需要,因为longtable默认情况下是水平居中的。
  • 我已经删除了multirow,在我看来,主题在字里行间的定位看起来太奇怪了。

答案2

对于将来可能会发现这一点的人,我需要我在 2017 年 10 月 31 日的评论中描述的版本,该版本可以推广到多列主题。现在可以在这里找到:https://github.com/paolobrasolin/topiclongtable

相关内容