settototalheight 出现空行问题

settototalheight 出现空行问题

我正在使用\settototalheight它来计算文本的高度以便needspace正确使用。

这是我正在使用的代码:

\documentclass[12pt]{article}

\usepackage{graphicx}
\usepackage[parfill]{parskip}
\usepackage[none]{hyphenat}
\sloppy
\usepackage[usenames,dvipsnames]{xcolor}
\usepackage{framed}
\usepackage{tikz}
\usepackage{array,ragged2e, calc}
\usepackage{enumitem}
\usepackage{lipsum}
\usepackage{mdframed}
\usepackage{needspace}
\usepackage{nolbreaks}

% ------------------------------------------------------------------------------------
% Fonts
% ------------------------------------------------------------------------------------
\usepackage{xunicode}
\usepackage{fontspec}
\usepackage{xltxtra}
\usepackage{txfonts}
% ------------------------------------------------------------------------------------

\definecolor{shadecolor}{RGB}{217,217,217}  % Color used for highlighting
\definecolor{light-blue}{RGB}{0,175,236}    % Color for the footer

% ------------------------------------------------------------------------------------
% Header and footer management.
% ------------------------------------------------------------------------------------
\usepackage{fancyhdr}
\pagestyle{fancy}

% clear any old style settings
\fancyhf{}

\fancyheadoffset{0in}
\headheight = 53pt

\renewcommand{\headrulewidth}{0pt}

\setmainfont{Calibri}

% ------------------------------------------------------------------------------------
% Defining the section style
\newcommand{\mysectionstyle}[1]{\colorbox{shadecolor}{\begin{tabular}{>{}p{\rectanglelength}}{\fontsize{13}{6}\selectfont\textbf{#1}}\end{tabular}}\vspace{6pt}}
% ------------------------------------------------------------------------------------

\addtolength{\footskip}{0.6cm}
\renewcommand{\footrulewidth}{1pt}
\renewcommand{\footrule}{{\color{light-blue}%
    \vskip-\footruleskip\vskip-\footrulewidth
    \hrule width\headwidth height\footrulewidth\vskip\footruleskip}}

% ------------------------------------------------------------------------------------

\usepackage[left=0.75in,top=1.5in,right=0.75in,bottom=1in]{geometry} % Document margins
\usepackage{titlesec}

\newlength{\rectanglelength}
\setlength{\rectanglelength}{\textwidth}
\addtolength{\rectanglelength}{-6pt}

\newlength{\foo}


\begin{document}
\lipsum[1]


\settototalheight{\foo}{\parbox[t]{\linewidth}{\begin{minipage}[t]{\linewidth} \begin{tabular}{@{}>{\RaggedRight}p{11cm}>{\RaggedLeft}p{6.35cm}@{}}\fontsize{13}{6}\selectfont{LaTeX}&\textbf{2011 to 2012}\end{tabular}\\\begin{tabular}{@{}>{\RaggedRight}p{11cm}>{\RaggedLeft}p{6.35cm}@{}}\textbf{Lead Programmer}&\textbf{}\end{tabular}%
\vspace{3pt}\begin{itemize}[parsep=0pt, topsep=0pt, itemsep=0pt, leftmargin=2ex]\item \lipsum[1]\item \lipsum[1]\item \lipsum[1]\item \lipsum[1]\item \lipsum[1]\item \lipsum[1]\item \lipsum[1]\item \lipsum[1]\item \lipsum[1]\end{itemize}%
\vspace{7pt}\textbf{End Title}\\\lipsum[1]

\vspace{10pt}\end{minipage}}
}
\needspace{\foo}{\setlength{\parskip}{4pt}

\mysectionstyle{Experiences}

\begin{tabular}{@{}>{\RaggedRight}p{11cm}>{\RaggedLeft}p{6.35cm}@{}}\fontsize{13}{6}\selectfont{LaTeX}&\textbf{2011 to 2012}\end{tabular}\\\begin{tabular}{@{}>{\RaggedRight}p{11cm}>{\RaggedLeft}p{6.35cm}@{}}\textbf{Lead Programmer}&\textbf{}\end{tabular}%
\vspace{3pt}\begin{itemize}[parsep=0pt, topsep=0pt, itemsep=0pt, leftmargin=2ex]\item \lipsum[1]\item \lipsum[1]\item \lipsum[1]\item \lipsum[1]\item \lipsum[1]\item \lipsum[1]\item \lipsum[1]\item \lipsum[1]\item \lipsum[1]\end{itemize}%
\vspace{7pt}\textbf{End Title}\\\lipsum[1]

\vspace{10pt}}
\end{document}

问题是 settototalheight 不接受空行,这是我在动态内容中无法控制的。(这是一个实时文本编辑器)。

是否有命令或包可以接受空行来计算文本的高度?这样做的真正目的是每个实时文本编辑器不能分成几页,或者如果分成几页,则从新页面开始,然后扩展到下一页(这就是使用 needspace 的原因)。

答案1

不幸的是,calc没有定义\settototalheight(更准确地说是辅助宏\@settodim\long,所以它不接受其参数中的空行。

我们需要打补丁\@settodim才能让它工作。加载完所有软件包后,将以下代码放入序言中:

%%% Patch calc
\makeatletter
\begingroup
\toks0=\expandafter{\@settodim{#1}{#2}{#3}}
\edef\x{\endgroup
  \long\def\noexpand\@settodim##1##2##3{\the\toks0 }}\x
\makeatother

(看https://tex.stackexchange.com/a/39980/4427对于使用相同技巧的类似答案)

答案2

adjustbox同名包中的环境允许您存储其内容的总高度(以及所有其他尺寸)。只需使用键即可允许minipage内容中的段落,最后gooble使用键则不在当前位置插入内容。

\documentclass{article}

\usepackage{adjustbox}

\newlength\mylength

\begin{document}

\begin{adjustbox}{minipage=\linewidth,gstore totalheight=\mylength,gobble}
Some text

with empty

lines
\end{adjustbox}

Total height is \the\mylength.

\end{document}

也可以使用密钥将内容存储到保存框中gstore,但是,您可能希望这里使用的是 vbox 而不是 hbox。

相关内容