如何在分页符上抑制 glsgroupskip?(词汇表包)

如何在分页符上抑制 glsgroupskip?(词汇表包)

我正在使用“词汇表”包来构建一个缩写列表。我根据标准的 longtable 样式定义了自己的样式(为了方便查看问题所在,我选择了“longheaderborder”样式)。当缩写列表分布在一页上并且样式中的“glsgoupskip”值大于零时,就会出现问题。在所使用的样式中,这意味着列表中的条目根据首字母分组,并且 longtable 中每组之间都有一个空行。

如果此分组跳转与分页符(长表分页符)重合,则自然会在第一页的末尾或第二页的开头得到一个空白行。为了阐明发生了什么,下面是我的最小示例:

\documentclass[]{scrbook} 

\usepackage[english]{babel} 
\usepackage[T1]{fontenc} 
\usepackage[latin1]{inputenc} 
% glossaries 
\usepackage[% 
acronym % use acronym functionality 
,section = section % use sections for all glossary lists 
]{glossaries} 
% some acronyms 
\newacronym{mimo}{MIMO}{Multiple Input Multiple Output} 
\newacronym{miso}{MISO}{Multiple Input Single Output} 
\newacronym{simo}{SIMO}{Single Input Multiple Output} 
\newacronym{siso}{SISO}{Single Input Single Output} 
\newacronym{cdma}{CDMA}{Code Division Multiple Access} 
\newacronym{ofdm}{OFDM}{Orthogonal Frequency Division Multiplex} 

% switch on glossaries 
\makeglossaries 

\begin{document} 
\chapter{Notation} 
\vspace{28\baselineskip} 
% print list of acronyms 
\glsaddall 
\printglossary[type=\acronymtype,style=longheaderborder] 
\end{document} 

我添加了vspace以防止我输入太多的缩写。:)

长话短说:glsgroupskip如果pagebreak发生了某事,怎样才能抑制它呢?


编辑

为了编写此文档,我进行了以下调用:

  1. pdflatex %
  2. makeindex -s %.ist -t %.alg -o %.acr %.acn
  3. pdflatex %

其中 % 表示文档文件名。
当我运行上面的示例时,MISO 条目后面直接有一个分组跳过(即空白行)。在这个分组跳过的正下方发生分页,因此在第一页的表格底部留下了一个空白行。

a groupskip (blank line) at the bottom of the table

如果将垂直跳过设置为此,29\baselineskip则空白行将出现在第二页表格顶部的表头正下方。

为了完整起见,这里是使用'tabu''booktabs'包的我自己定义的样式的 MWE。为了构建此文档,我调用了与上面提到的相同的命令。目的是将 groupskip 设置为\addlinespace(booktabs 命令),但问题更明显地出现在完整的空白行(&\\)。

\documentclass[]{scrbook} 

\usepackage[english]{babel} 
\usepackage[T1]{fontenc} 
\usepackage[latin1]{inputenc} 

% table packages 
\usepackage{booktabs,longtable,tabu} 
% glossaries 
\usepackage[% 
acronym % use acronym functionality 
,section = section % use sections for all glossary lists 
,nonumberlist % no page references in lists 
,nostyles % do not load  any style 
]{glossaries} 

% define new style for acronyms 
\newglossarystyle{my_acronymlist}{% 
\renewenvironment{theglossary}% 
{\begin{longtabu} to\linewidth {lX}}% 
{\end{longtabu}}% 
\renewcommand*{\glossaryheader}{\toprule Acronym & Description\\\midrule\endhead% 
\toprule Acronym & Description\\\midrule\endfirsthead% 
\bottomrule\endfoot}% 
\renewcommand*{\glsgroupheading}[1]{}% 
\renewcommand*{\glossaryentryfield}[5]{% 
\glstarget{##1}{##2} & \glsentrydesc{##1}\\}% 
% 
\renewcommand*{\glossarysubentryfield}[6]{% 
&% 
\glssubentryitem{##2}% 
\glstarget{##2}{\strut}##4 & ##6\\}% 
% 
%*** GROUP SKIP *** 
\renewcommand*{\glsgroupskip}{&\\}% 
%\renewcommand*{\glsgroupskip}{\addlinespace}% 
%****************** 
} 

% some acronyms 
\newacronym{mimo}{MIMO}{Multiple Input Multiple Output} 
\newacronym{miso}{MISO}{Multiple Input Single Output} 
\newacronym{simo}{SIMO}{Single Input Multiple Output} 
\newacronym{siso}{SISO}{Single Input Single Output} 
\newacronym{cdma}{CDMA}{Code Division Multiple Access} 
\newacronym{ofdm}{OFDM}{Orthogonal Frequency Division Multiplex} 

% switch on glossaries 
\makeglossaries 

\begin{document} 

\chapter{Notation} 

\vspace{28\baselineskip} 
% print list of acronyms 
\glsaddall 
\printglossary[type=\acronymtype,style=my_acronymlist] 

\end{document}

通过这种样式,我在第二页的顶部得到了这个空白的分组跳行。

blank line with own defined style

当我添加

\expandafter\let\csname @glsstyle@my_acronymlist\endcsname\relax

在样式定义之前,设置

\renewcommand*{\glsgroupskip}{\noalign{\penalty-50\vskip\normalbaselineskip}}%

遗憾的是,我看不到任何变化。
不过,到目前为止,还是感谢您的帮助。希望能有一个解决方案……

答案1

也许你应该使用真正的空格而不是空白表格行,这样它就会被自动丢弃。如果没有垂直规则,效果会更好,但我现在保留了这些规则。

在词汇表包加载后将其添加到序言中可能会产生一些作用。

\expandafter\let\csname @glsstyle@long\endcsname\relax
\newglossarystyle{long}{%
  \renewenvironment{theglossary}%
     {\begin{longtable}{lp{\glsdescwidth}}}%
     {\end{longtable}}%
  \renewcommand*{\glossaryheader}{}%
  \renewcommand*{\glsgroupheading}[1]{}%
  \renewcommand*{\glossaryentryfield}[5]{%
    \glsentryitem{##1}\glstarget{##1}{##2} & ##3\glspostdescription\space ##5\\}%
  \renewcommand*{\glossarysubentryfield}[6]{%
     &
     \glssubentryitem{##2}%
     \glstarget{##2}{\strut}##4\glspostdescription\space ##6\\}%
  \renewcommand*{\glsgroupskip}{\noalign{\penalty-50\vskip\normalbaselineskip}}%
}

上述内容在理想情况下应该可以正常工作,但 longtable 有一些“特性”阻碍了这一点。值得注意的是,输出例程不会插入表头当前的页面,而是由上一页的输出例程注入的。这意味着粘连不会在页面顶部被丢弃。(通常这不是问题,因为表格没有可丢弃的粘连......

因此,以下方法似乎有效。惩罚 -50 和组间增加的跳过(此处为 15 分)相当随意,但惩罚可能应该是负数,并且值必须与在首字母缩略词样式中设置的位置相同\noalign,并且(两次)在 longtable 内部插入了更正

重新定义\LT@outputLT 来检查分页符是否发生在 -50 处,如果是,则后退 15pt 以允许在这些特殊分页符处添加 15pt 跳过。

\documentclass[]{scrbook} 

\usepackage[english]{babel} 
\usepackage[T1]{fontenc} 
\usepackage[latin1]{inputenc} 

% table packages 
\usepackage{booktabs,longtable,tabu} 
% glossaries 
\usepackage[% 
acronym % use acronym functionality 
,section = section % use sections for all glossary lists 
,nonumberlist % no page references in lists 
,nostyles % do not load  any style 
]{glossaries} 

% define new style for acronyms 
\newglossarystyle{my_acronymlist}{% 
\renewenvironment{theglossary}% 
{\begin{longtabu} to\linewidth {lX}}% 
{\end{longtabu}}% 
\renewcommand*{\glossaryheader}{\toprule Acronym & Description\\\midrule\endhead% 
\toprule Acronym & Description\\\midrule\endfirsthead% 
\bottomrule\endfoot}% 
\renewcommand*{\glsgroupheading}[1]{}% 
\renewcommand*{\glossaryentryfield}[5]{% 
\glstarget{##1}{##2} & \glsentrydesc{##1}\\}% 
% 
\renewcommand*{\glossarysubentryfield}[6]{% 
&% 
\glssubentryitem{##2}% 
\glstarget{##2}{\strut}##4 & ##6\\}% 
% 
%*** GROUP SKIP *** 
\renewcommand*{\glsgroupskip}{&\\}% 
%\renewcommand*{\glsgroupskip}{\addlinespace}% 
\renewcommand*{\glsgroupskip}{\noalign{\penalty-50\vskip15pt\relax}}%

%****************** 
} 

% some acronyms 
\newacronym{mimo}{MIMO}{Multiple Input Multiple Output} 
\newacronym{miso}{MISO}{Multiple Input Single Output} 
\newacronym{simo}{SIMO}{Single Input Multiple Output} 
\newacronym{siso}{SISO}{Single Input Single Output} 
\newacronym{cdma}{CDMA}{Code Division Multiple Access} 
\newacronym{ofdm}{OFDM}{Orthogonal Frequency Division Multiplex} 

% switch on glossaries 
\makeglossaries 

\makeatletter
\def\LT@output{%
  \ifnum\outputpenalty <-\@Mi
    \ifnum\outputpenalty > -\LT@end@pen
      \LT@err{floats and marginpars not allowed in a longtable}\@ehc
    \else
      \setbox\z@\vbox{\unvbox\@cclv}%
      \ifdim \ht\LT@lastfoot>\ht\LT@foot
        \dimen@\pagegoal
        \advance\dimen@-\ht\LT@lastfoot
        \ifdim\dimen@<\ht\z@
          \setbox\@cclv\vbox{\unvbox\z@\copy\LT@foot\vss}%
          \@makecol
          \@outputpage
          \setbox\z@\vbox{\box\LT@head
\ifnum\outputpenalty=-50\vskip-15pt\relax\fi
}%
        \fi
      \fi
      \global\@colroom\@colht
      \global\vsize\@colht
%      \vbox
        {\unvbox\z@\box\ifvoid\LT@lastfoot\LT@foot\else\LT@lastfoot\fi}%
    \fi
  \else
    \setbox\@cclv\vbox{\unvbox\@cclv\copy\LT@foot\vss}%
    \@makecol
    \@outputpage
      \global\vsize\@colroom
    \copy\LT@head
\ifnum\outputpenalty=-50\vskip-15pt\relax\fi
\nobreak
  \fi}
\makeatother
\begin{document} 

\chapter{Notation} 

\vspace{28\baselineskip} 
% print list of acronyms 
\glsaddall 
\printglossary[type=\acronymtype,style=my_acronymlist] 

\end{document}

相关内容