我创建了一个 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