以可变高度垂直分隔页面

以可变高度垂直分隔页面

其他解释:

这是一个模板,在标记 #1 处插入了一个表格,在标记 #3 处插入了一些文本。插入的文本和表格对于每个数据集的大小不同。通常两者都适合放在一页上,但有些更长。因此,在正常情况下,两者都小于半页长,\rule(标记 #2)应该保持垂直居中。在任何其他情况下,如果一个大于半页,它应该向上或向下移动,如果表格(标记 #1)长于 1 页,它甚至应该移动到下一页。如果有两页,\rule如果文本(标记 #3)不太长,最好将(标记 #2)放在第二页的中央,但这不是必要的。


如何让\rule(标记#2)垂直保持在页面中心?

如果表格(标记 #1)增大,则应将\rule(标记 #2)向下移动或移至下一页。如果文本(标记 #3)增大,则应将\rule(标记 #2)向上移动,然后再开始新的一页。

内容表和文本由python脚本生成,并且每个数据集的大小不一样。

有没有简单的方法可以做到这一点?或者我必须获取文本和表格的大小并计算变量的值\vspace

\documentclass{scrartcl}
\usepackage{longtable}
\usepackage{tabu}
\usepackage{blindtext}

\begin{document}
\begin{longtabu}{XXX} %#1
  1 & 2 & 3 \\
  4 & 5 & 6 \\
  7 & 8 & 9 \\
\end{longtabu}
\vfill
\noindent\rule[1mm]{1.0\textwidth}{2pt} %#2
\blindtext %#3
\vfill
\end{document}

\vfill目前正在使用这种方法来保持页面内容均匀分布,但我的目标是让\rule(标记 #2)尽可能长时间地保持在页面的中心。表格和文本(标记 #1 和 #2)用 python 填充,文本和表格没有固定长度。因此,文档可能长于一页,并且(标记 #2)可能\rule在第二页。

一些例子:

| 表格高度 (标记 #1) | 文本高度 (标记 #3) | 距顶部约 x 英寸处的线段 |
|------------------------|-----------------------|-----------------------|
| 0.25\textheight | 0.25\textheight | 0.50\textheight |
| 0.60\textheight | 0.25\textheight | 0.60\textheight |
| 0.25\textheight | 0.60\textheight | 0.40\textheight |
| 1.50\textheight | 0.25\textheight | 下一页 0.50\textheight |


解决方案:

以下是我现在使用的。它基于 cfr 的答案并支持多页,以便\rule保持在后续页面的中心,或者如果由于底部文本而需要开始新页面。

这是我第一次做这样的事情,所以如果有错误或更好的方法,请告诉我。

\documentclass{scrartcl}
\usepackage{longtable}
\usepackage{tabu}
\usepackage{calc}
\usepackage{blindtext}

\newlength{\mytopheight}
\newlength{\mybotheight}
\newcommand*\mymidrule{\noindent\rule[1mm]{\linewidth}{2pt}}

\newlength{\targetheight}
\setlength{\targetheight}{\dimexpr\textheight-2pt-2\baselineskip-2\parskip}% if an adjustment is needed for the rule width

\newlength{\mybotoversize}
\newlength{\myspacing}

\newlength{\lengtha}

\newsavebox{\mytop}
\newsavebox{\mybot}

\setlength{\parindent}{0pt}

\newcommand\myrulesplit[2]{%
  \sbox{\mytop}{%
    \begin{minipage}[t]{\linewidth}
        #1
    \end{minipage}%
  }%
  \sbox{\mybot}{%
    \begin{minipage}[t]{\linewidth}
        #2
    \end{minipage}%
  }%
  \settototalheight{\mytopheight}{\usebox{\mytop}}%
  \settototalheight{\mybotheight}{\usebox{\mybot}}%
  \loop
    \ifdim\mytopheight>\textheight
    \setlength{\mytopheight}{\dimexpr\mytopheight-\textheight}%
  \repeat
  \loop
    \ifdim\mybotheight>\textheight
    \setlength{\mybotheight}{\dimexpr\mybotheight-\textheight}%
  \repeat
  \setlength{\mybotoversize}{\dimexpr\mybotheight-.5\targetheight}
  \ifdim\mybotoversize<0pt\setlength{\mybotoversize}{0pt}\fi % if smaler than half of the available space
  \setlength{\myspacing}{\dimexpr.5\targetheight-\mytopheight}
  \ifdim\mybotoversize<\myspacing\setlength{\myspacing}{\dimexpr\myspacing-\mybotoversize}\fi % bottom smaler then available space move rule
  \ifdim\myspacing<0pt\setlength{\myspacing}{0pt}\fi % if page is full
  #1\par\vspace*{\myspacing}\mymidrule\par#2
  % mytopheight:\the\textheight\\
  % mytopheight:\the\mytopheight\\
  % mybotheight:\the\mybotheight\\
  % mybotoversize:\the\mybotoversize\\
  % myspacing:\the\myspacing\\
}



\begin{document}
  \myrulesplit{%
    \begin{longtabu}{XXX} %#1
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
    \end{longtabu}
  }{%
    \blindtext

    \blindtext

    \blindtext

    \blindtext
  }
  \clearpage
  \myrulesplit{%
    \begin{longtabu}{XXX} %#1
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
    \end{longtabu}
  }{%
    \blindtext

    \blindtext
  }
  \clearpage
  \myrulesplit{%
    \begin{longtabu}{XXX} %#1
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
    \end{longtabu}
  }{%
    \blindtext

    \blindtext

    \blindtext

    \blindtext
  }
  \clearpage
  \myrulesplit{%
    \begin{longtabu}{XXX} %#1
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      1 & 2 & 3 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
    \end{longtabu}
  }{%
    \blindtext
  }
  \clearpage
  \myrulesplit{%
    \begin{longtabu}{XXX} %#1
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      7 & 8 & 9 \\
      7 & 8 & 9 \\
      7 & 8 & 9 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      1 & 2 & 3 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
    \end{longtabu}
  }{%
    \blindtext
  }
  \clearpage
\myrulesplit{%
    \begin{longtabu}{XXX} %#1
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      7 & 8 & 9 \\
      7 & 8 & 9 \\
      7 & 8 & 9 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      1 & 2 & 3 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
    \end{longtabu}
  }{%
    \blindtext

    \blindtext

    \blindtext
  }
  \clearpage
  \myrulesplit{%
    \begin{longtabu}{XXX} %#1
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      7 & 8 & 9 \\
      7 & 8 & 9 \\
      7 & 8 & 9 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      1 & 2 & 3 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      7 & 8 & 9 \\
      7 & 8 & 9 \\
      7 & 8 & 9 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      1 & 2 & 3 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
    \end{longtabu}
  }{%
    \blindtext
  }
\end{document}

答案1

如果我明白你的问题了,这个可能可能做一些模糊的你想要的事情。但我对此非常没有信心!

\documentclass{scrartcl}
\usepackage{longtable}
\usepackage{tabu}
\usepackage{calc}
\usepackage{blindtext}
\newlength{\mytopheight}
\newlength{\mybotheight}
\newcommand*\mymidrule{\noindent\rule[1mm]{\linewidth}{2pt}}
\newlength{\targetheight}
\setlength{\targetheight}{\dimexpr\textheight-2pt-2\baselineskip-2\parskip}% if an adjustment is needed for the rule width
\newlength{\lengtha}
\newsavebox{\mytop}
\newsavebox{\mybot}
\newlength{\normalparindent}
\setlength{\normalparindent}{\parindent}
\newcommand\myrulesplit[2]{%
  \sbox{\mytop}{%
    \begin{minipage}[t]{\linewidth}
      \setlength{\parindent}{\normalparindent}%
        #1
    \end{minipage}%
  }%
  \sbox{\mybot}{%
    \begin{minipage}[t]{\linewidth}
      \setlength{\parindent}{\normalparindent}%
        #2
    \end{minipage}%
  }%
  \settototalheight{\mytopheight}{\usebox{\mytop}}%
  \ifdim\mytopheight>.5\targetheight#1\par\mymidrule\par#2
  \else
    \settototalheight{\mybotheight}{\usebox{\mybot}}%
    \ifdim\mybotheight>.5\targetheight
      \setlength{\lengtha}{\dimexpr\mytopheight+\mybotheight}%
      \ifdim\lengtha>\targetheight#1\par\mymidrule\par#2
      \else#1\vfill\par\mymidrule\par#2%
      \fi
    \else
      \smash{\usebox{\mytop}}\vfill\par\mymidrule\par\smash{\usebox{\mybot}}\vfill%
    \fi
  \fi
}

\begin{document}
  \myrulesplit{%
    \begin{longtabu}{XXX} %#1
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
    \end{longtabu}
  }{%
    \blindtext

    \blindtext
  }
  \clearpage
  \myrulesplit{%
    \begin{longtabu}{XXX} %#1
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
    \end{longtabu}
  }{%
    \blindtext

    \blindtext

    \blindtext

    \blindtext
  }
  \clearpage
  \myrulesplit{%
    \begin{longtabu}{XXX} %#1
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
      1 & 2 & 3 \\
      4 & 5 & 6 \\
      7 & 8 & 9 \\
    \end{longtabu}
  }{%
    \blindtext
  }
\end{document}

3 种场景

答案2

这是其中一种方法。它\raisebox正好占据了半页。

\documentclass{scrartcl}
\usepackage{longtable}
\usepackage{tabu}
\usepackage{blindtext}

\newsavebox{\tempbox}

\begin{document}
\noindent\raisebox{-\height}[0pt][0.5\textheight]{%
\begin{minipage}{\textwidth}
\begin{longtabu}{XXX} %#1
  1 & 2 & 3 \\
  4 & 5 & 6 \\
  7 & 8 & 9 \\
\end{longtabu}
\end{minipage}}
\noindent\rule[1mm]{1.0\textwidth}{2pt} %#2
\blindtext %#3

\end{document}

这是另一个。由于每个都\vfill扩展到相同的大小,因此上方和下方占用的空间必须相同。 \smash使它们实际上不占用任何空间。可以使用\rlap\llap在水平方向上实现相同的效果。

\documentclass{scrartcl}
\usepackage{longtable}
\usepackage{tabu}
\usepackage{blindtext}

\newsavebox{\tempbox}

\begin{document}
\noindent\smash{\begin{minipage}[t]{\textwidth}
\begin{longtabu}{XXX} %#1
  1 & 2 & 3 \\
  4 & 5 & 6 \\
  7 & 8 & 9 \\
\end{longtabu}
\end{minipage}}
\vfill
\noindent\rule[1mm]{1.0\textwidth}{2pt} %#2
\noindent\smash{\begin{minipage}[t]{\textwidth}
\blindtext %#3
\end{minipage}}
\vfill
\end{document}

相关内容