问题:X
我正在寻找一种方法,以自定义的词汇表样式将列与多页表结合使用。
更新
根据 Nicola Talbot 的评论,我创建了以下 MWE:
1. 使用禁忌的旧方法:
\documentclass[a4paper,parskip=half]{scrreprt}
\usepackage{setspace}
\AtBeginDocument{\setstretch{1.25}}
\usepackage{tabu}
\usepackage[xindy, acronyms, nonumberlist, nogroupskip,shortcuts]{glossaries}
\newglossarystyle{customlong}{%
\renewenvironment{theglossary}%
{\tabulinesep=1.2mm \begin{longtabu}{@{}lX}}%
{\end{longtabu}}%
\renewcommand*{\glossaryheader}{}%
\renewcommand*{\glsgroupheading}[1]{}%
\renewcommand*{\glossaryentryfield}[5]{%
\glstarget{##1}{##2} & ##3\glspostdescription\space ##5\\}%
\renewcommand*{\glossarysubentryfield}[6]{%
& \glstarget{##2}{\strut}##4\glspostdescription\space ##6\\}%
\renewcommand*{\glsgroupskip}{ & \\}%
}
\newacronym{DMSO}{DMSO}{dimethyl sulfoxide}
\newacronym{DABCO}{DABCO}{1,4-diazabicyclo[2.2.2]octane}
\newacronym{longacronym}{longacronym}{description of a long acronym}
\begin{document}
\printglossary[type=acronym,style=customlong]
\acs{DABCO}
\acs{DMSO}
\end{document}
这基本上产生了所需的输出:缩写列的宽度符合预期,并且行距不是太大。
2. 使用 alttree 样式的新方法:
\documentclass[a4paper,parskip=half]{scrreprt}
\usepackage{setspace}
\usepackage[xindy, acronyms, nonumberlist, nopostdot, numberline, numberedsection=autolabel, nogroupskip,style=long, shortcuts]{glossaries}
\renewcommand{\glossarypreamble}{\glsfindwidesttoplevelname[\currentglossary]}
\renewcommand*{\glstreenamefmt}[1]{#1}
\renewcommand*{\chapterheadstartvskip}{\vspace*{-\topskip}}
\AtBeginDocument{\setstretch{1.25}}
\newacronym{DMSO}{DMSO}{dimethyl sulfoxide}
\newacronym{DABCO}{DABCO}{1,4-diazabicyclo[2.2.2]octane}
\begin{document}
\printglossary[type=acronym,style=alttree]
\acs{DABCO}
\acs{DMSO}
\end{document}
这种方法可以得到缩写列所需的宽度,但是列表中的行距太大。这个距离似乎受到和的影响parskip=half
,\setstretch{1.25}
但由于我需要这些命令来获得文档其余部分所需的行距,所以我不知道如何摆脱它们。
3. 使用 alttree 样式的新方法,奇怪的间距:
\documentclass[a4paper,parskip=half]{scrreprt}
\usepackage{setspace}
\usepackage[xindy, acronyms, nonumberlist, nopostdot, numberline, numberedsection=autolabel, nogroupskip,style=long, shortcuts]{glossaries}
\renewcommand{\glossarypreamble}{\glsfindwidesttoplevelname[\currentglossary]}
\renewcommand*{\glstreenamefmt}[1]{#1}
\renewcommand*{\chapterheadstartvskip}{\vspace*{-\topskip}}
\AtBeginDocument{\setstretch{1.25}}
\newacronym{DMSO}{DMSO}{dimethyl sulfoxide}
\newacronym{DABCO}{DABCO}{1,4-diazabicyclo[2.2.2]octane}
\newacronym{longacronym}{longacronym}{description of a long acronym}
\begin{document}
\printglossary[type=acronym,style=alttree]
\acs{DABCO}
\acs{DMSO}
\end{document}
在本 MWE 中,我包含了一个长缩写词的定义,该缩写词在文档本身中没有明确使用。然而,在计算最宽缩写词的宽度时,似乎会考虑这个长缩写词。
背景:我目前正在使用该glossaries
包打印缩写和首字母缩略词列表。列表所需的样式是两列表格,左侧是首字母缩略词,右侧是长格式或描述。基本上,这可以通过 acronymstyle 实现long-short
。
使用这种样式时,我遇到的唯一问题是,当我将长首字母缩略词与需要在第二列中换行的长表格组合在一起时。对于这些情况,我手动将其更改\setlength{\glsdescwidth}
为大致适合文本宽度减去左列宽度的值。由于缩写的长度在整个写作过程中不断变化,我必须\setlength{\glsdescwidth}
根据当前所需的宽度不断更改。这总是反复尝试,并不那么准确,因此对我来说相当烦人。
因此,我编写了一个自定义样式,使用包的X
列和环境来自动确定第二列的宽度:longtabu
tabu
\newglossarystyle{customlong}{%
\renewenvironment{theglossary}%
{\tabulinesep=1.2mm \begin{longtabu}{@{}lX}}%
{\end{longtabu}}%
\renewcommand*{\glossaryheader}{}%
\renewcommand*{\glsgroupheading}[1]{}%
\renewcommand*{\glossaryentryfield}[5]{%
\glstarget{##1}{##2} & ##3\glspostdescription\space ##5\\}%
\renewcommand*{\glossarysubentryfield}[6]{%
& \glstarget{##2}{\strut}##4\glspostdescription\space ##6\\}%
%\renewcommand*{\glsgroupskip}{ & \\}%
}
\setglossarystyle{customlong}
对于我来说,这一直工作得很好,但最近我被警告使用该tabu
包时因为它有缺陷,而且我自己也遇到了一些奇怪的行为(虽然不是上面描述的词汇表样式)。
因此,我考虑切换到该tabularx
软件包,它也能提供可变宽度的X
列。但由于我的首字母缩略词列表分布在多个页面,我需要一个带有列的长表X
。根据创建表的包概述有ltxtable
和ltablex
方案来实现这一目标。根据ltttable 与 ltablex 的比较似乎ltablex
有错误。不幸的是,ltxtable
要求表格放在单独的文件中。我知道这个filecontents
包,但不知道如何在我的案例中实现它。
答案1
正如您所注意到的,\glsfindwidesttoplevelname
它会检查所有已定义的条目,而不仅仅是那些已使用的条目。该glossaries-extra-stylemods
包(已加载\usepackage[stylemods]{glossaries-extra}
)\glsFindWidestUsedTopLevelName
仅检查已标记为已使用的条目。
如果您的词汇表在后页,这将非常有用。如果您的词汇表在前页(如在 MWE 中),则必须在文档末尾计算最广泛使用的条目,并将其保存在文件中.aux
以供下次运行 LaTeX 时使用。
\makeatletter
\AtEndDocument{\glsFindWidestUsedTopLevelName[\acronymtype]%
\protected@write\@auxout{}{\string\xglssetwidest{\glsgetwidestname}}%
}
\makeatother
这里唯一的问题是\acs
没有将条目标记为已使用,因此您需要为文档中引用的每个条目至少添加一个\ac
(或等等)才能使其正常工作。如果您不希望任何缩写显示完整形式,请使用缩写样式。\gls
short-nolong
\setabbreviationstyle[acronym]{short-nolong}% glossaries-extra.sty
\newacronym{DMSO}{DMSO}{dimethyl sulfoxide}
\newacronym{DABCO}{DABCO}{1,4-diazabicyclo[2.2.2]octane}
\newacronym{longacronym}{longacronym}{description of a long acronym}
如果您希望某些缩写在第一次使用时显示完整形式,则请使用\newabbreviation
而不是\newacronym
:
\setabbreviationstyle[acronym]{short-nolong}
\setabbreviationstyle{long-short}
% short-nolong abbreviations:
\newacronym{DMSO}{DMSO}{dimethyl sulfoxide}
\newacronym{DABCO}{DABCO}{1,4-diazabicyclo[2.2.2]octane}
% long-short abbreviations:
\newabbreviation{longacronym}{longacronym}{description of a long acronym}
(这些缩写样式实际上是的默认设置。如果您想要这种混合,则glossaries-extra
需要将acronyms
包选项更改为。)abbreviations
如果您确实不想使用\ac
(或\gls
),那么您必须确定哪些条目已被索引(而不是标记为已使用)。这需要挂接到索引机制或挂接到词汇表样式,这两者都需要将信息保存到文件中.aux
以供下次运行。
(请注意,longtable
还需要将信息保存到.aux
文件中,以确定诸如的说明符的正确列宽l
。需要测量每个单元格的内容以确定给定列的适当宽度。)
可以通过本地关闭 KOMA 选项来处理条目之间的额外间距parskip
,这可以在 中完成\glossarypreamble
。
修正后的 MWE:
\documentclass[a4paper,parskip=half]{scrreprt}
\usepackage{setspace}
\usepackage[xindy,
acronyms,% use 'abbreviations' instead for mixture of `\newacronym` and `\newabbreviation`
nonumberlist,
%nopostdot, % 'nopostdot' is the default with glossaries-extra.sty
numberline,
numberedsection=autolabel,
nogroupskip,
stylemods% load glossaries-extra-stylemods.sty
]{glossaries-extra}
\GlsXtrDefineAcShortcuts % provide \ac etc shortcut commands
\renewcommand{\glossarypreamble}{\KOMAoptions{parskip=off}}
\renewcommand*{\glstreenamefmt}[1]{#1}
\renewcommand*{\chapterheadstartvskip}{\vspace*{-\topskip}}
\AtBeginDocument{\setstretch{1.25}}
\makeatletter
\AtEndDocument{\glsFindWidestUsedTopLevelName%
\protected@write\@auxout{}{\string\xglssetwidest{\glsgetwidestname}}%
}
\makeatother
\makeglossaries
\setabbreviationstyle[acronym]{short-nolong}
\newacronym{DMSO}{DMSO}{dimethyl sulfoxide}
\newacronym{DABCO}{DABCO}{1,4-diazabicyclo[2.2.2]octane}
\newacronym{longacronym}{longacronym}{description of a long acronym}
\begin{document}
\printglossary[type=acronym,style=alttree]
\ac{DABCO}
\ac{DMSO}
\end{document}
答案2
对于列X
分布在各个页面上的表格,您可以加载包,该包将ltablex
的功能引入。如果您希望列(和表格)具有所需的宽度,请添加指令- 否则 X 列的计算宽度仅为其最大宽度。longtable
tabularx
\keepXColumns
X
语法与 相同longtable
:您可以指定\endhead
、\endfirsthead
、\endfoot
、\endlastfoot
。特别是,标题应合并到第一个标题中。