我正在使用“词汇表”包来构建一个缩写列表。我根据标准的 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
发生了某事,怎样才能抑制它呢?
编辑:
为了编写此文档,我进行了以下调用:
pdflatex %
makeindex -s %.ist -t %.alg -o %.acr %.acn
pdflatex %
其中 % 表示文档文件名。
当我运行上面的示例时,MISO 条目后面直接有一个分组跳过(即空白行)。在这个分组跳过的正下方发生分页,因此在第一页的表格底部留下了一个空白行。
如果将垂直跳过设置为此,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}
通过这种样式,我在第二页的顶部得到了这个空白的分组跳行。
当我添加
\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@output
LT 来检查分页符是否发生在 -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}