我使用词汇表包来获取首字母缩略词和符号列表。我希望词汇表采用目录样式,即在页面左侧添加尾随点,并在此处引用首次使用页面。
我使用 Xindy,并使用see
符号词汇表中的关键字进行交叉引用。我想保留 altlist 风格的样式,例如:
(这是当前情况的图像编辑)
我看了一下词汇表手册,特别是:
- 参见密钥的文档,其中规定“交叉引用信息[...]构成编号列表的一部分”;
- (一般)数字列表部分它为选项 1(使用 TeX 进行索引)提供了工具来执行我想要的操作,但没有为 makeindex 或 xindy 选项提供工具来执行我想要的操作;
- Xindy 专用号码列表部分,特别是
GlsSetXdyLocationClassOrder
命令,允许改变参考类别的顺序(见下文); - 自定义交叉引用部分,允许
\glsseeformat
重新定义参考的格式。
因此,我开始研究样式。我查看了列表样式的来源,发现我想要更改的内容(引用、交叉引用以及其后的内容:这三个实际上是作为 的第二个参数给出的一个大内容glossentry
)不在样式定义中。因此,我只是使用我想要的样式:\setglossarystyle{altlist}
。
从查看关键文档中,我了解到我需要调查数字列表。在软件包文档的 xindy-dedicated 部分中,我想到使用以下方法将交叉引用与“正常”引用反转:
\GlsSetXdyLocationClassOrder{%
"see"
"arabic-page-numbers"
"arabic-section-numbers"
"roman-page-numbers"
"Roman-page-numbers"
"alpha-page-numbers"
"Alpha-page-numbers"
"Appendix-page-numbers"
}
(在默认定义中,除了“see”字段放在最后之外,其他一切都相同。)
然后我需要在交叉引用 (XRefs) 和普通引用之间添加点。我没有找到修改(实际)引用列表格式的命令(因此只能修改普通引用),因此我没有添加点前引用,我将它们添加到 XRefs 之后(这导致了第一个问题),使用:
\renewcommand*{\glsseeformat}[3][\seename]{\emph{#1} \glsseelist{#2}\dotfill}
第一个问题:
我有我的点,但仅用于入口和交叉引用。
编辑:已解决。我查看了生成的文件,发现页码是由 \glsXpageXglsnumberformat 命令打印的;该命令在这些文件的开头定义。所以我使用\glossarypreamble
(而不是\glossaryheader
为了不干扰样式)作为切入点。关于解决方案的几点发现:
- 阅读@nicola-talbot 的回答这里,我使用
\leaders
命令代替\dotfill
; - 为了像目录中那样将点停止在“一列”上,我将页码放在固定宽度的框中;
- 但是,描述在数字上方换行,而不是像目录中那样在点停止的地方换行。我还没有弄清楚。
当前代码如下:
\renewcommand*\glossarypreamble{
\renewcommand*\glsXpageXglsnumberformat[2]{%
\unskip\xleaders\hbox to 2.9mm{\hss.}\hfill%
\makebox[\widthof{0000}][r]{%
\setentrycounter[##1]{page}\glsnumberformat{##2}%
}%
}%
}
第二个问题:
在点之后,Xindy 风格添加逗号作为所使用的不同引用类型之间的分隔符。
这两个问题如第二张附图所示:
第三个(可选)问题:
我想自动将字符串(第一个单词)大写seename
。我尝试使用\capitalisewords
from package mfirstuc
,但它没有展开并将整个单词大写。有什么想法吗?
为了解决第一个问题,也许我可以在描述后使用添加点\renewcommand*{\glspostdescription}{\dotfill}
,但我必须区分没有 XRefs 的情况(需要重新定义)和有 XRefs 的情况(描述和交叉引用之间不能有点)。
第二个是由于 xindy 风格,所以我需要改变它。在数字列表部分,我在示例中找到了此命令:
\GlsAddXdyLocation{romansc}{:sep "\string\textsc\glsopenbrace"
"roman-numbers-lowercase" :sep "\glsclosebrace"}
这让我想到了重新定义\glsclosebrace
:\renewcommand*{\glsclosebrace}{}
但它会提示“扫描 \glsgroupheading 的使用时文件结束”之类的错误。
答案1
第一个问题,交叉引用或说明与页码之间的点:
首先,反转 XRef 和页码显示:
\GlsSetXdyLocationClassOrder{%
"see"
"arabic-page-numbers"
"arabic-section-numbers"
"roman-page-numbers"
"Roman-page-numbers"
"alpha-page-numbers"
"Alpha-page-numbers"
"Appendix-page-numbers"
}
用于参数化显示的一系列长度:
\newlength{\stdlinewidth} \setlength{\stdlinewidth}{\linewidth} % width for the content, including page numbers
\newlength{\glsdottedpagerefwidth} % width allocated for the page numbers
\newlength{\glsdottedpagerefwidthoffset} % optional offset between descriptions and page numbers
\glsdottedpagerefwidth
:这是页码框允许的宽度。应将其设置为最宽的数字加上一个小空格(请查看目录的格式)。例如,如果文档有 100 多页,但少于 1000 页,则其宽度至少应为 000。
\glsdottedpagerefwidthoffset
:对于首字母缩略词无用。由于描述可能很长,我发现与点的末尾和页码“列”的开头对齐的文本块不太美观。这是描述的行尾和页码“列”之间的距离。但是,在纯文本中摆弄了很久之后,我还没有找到一种方法将点打印为一个块,而不需要完全破解词汇表(例如,将描述保存在框中并在页码命令中打印 :/),因此点是通过不同的跳过获得的。那么就不好了。
实际参数化:
\setlength{\glsdottedpagerefwidth}{\widthof{0000}}
\setlength{\glsdottedpagerefwidthoffset}{2em}
然后,添加点:
% puttings dots up to the end of line, before page number
\renewcommand*\glossarypreamble{
\addtolength{\linewidth}{-\glsdottedpagerefwidth-\glsdottedpagerefwidthoffset}
\renewcommand*\glsXpageXglsnumberformat[2]{%
\unskip\xleaders\hbox to 2.9mm{\hss.}\hfill%
\makebox[0pt][l]{%
\makebox[\glsdottedpagerefwidth+\glsdottedpagerefwidthoffset][l]{%
\unskip\xleaders\hbox to 2.9mm{\hss.}\hfill%
\makebox[\glsdottedpagerefwidth][r]{%
\setentrycounter[##1]{page}\glsnumberformat{##2}%
}%
}%
}%
}
}
% restoring linewidth: useless, but for a clear conscience.
\renewcommand*\glossarypostamble{\setlength{\linewidth}{\stdlinewidth}}
第二个问题,点前有逗号:
对于没有交叉引用的条目,没有问题:只需重新定义\glspostdescription
。
对于有交叉引用的条目,我发现了一个更肮脏的 hack,在这个回答:重新定义逗号前面的命令以吞噬另一个参数并将其忽略。我还需要在描述之后和引用之前恢复一个点,我在删除 LaTeX 可能添加的任何跳过后添加了这个点:
\renewcommand*{\glspostdescription}{}
\renewcommand*{\glsseeformat}[4][\seename]{% % 4th "arg" (undelimited one) is the comma
\unskip. \emph{#1} \glsseelist{#2}}
第三个问题,大写seename
宏:
只需将其重新定义为总扩展宏即可。但是,该语言似乎归属于printglossary
,因此必须在序言中完成:
\renewcommand*\glossarypreamble{
\let\oldseename\seename
\edef\seename{\capitalisewords{\oldseename}}
[ToC style stuff]
}
由于可以有多个词汇表,因此可以多次调用 glossarypreamble,我们在 postamble 中恢复原始定义:
\renewcommand*\glossarypostamble{%
\setlength{\linewidth}{\stdlinewidth}%
\let\seename\oldseename%
}
结论
所有这些都很不靠谱,所以如果有人有其他解决方案,我非常乐意接受!
结果:
- 自愿将偏移量设置为 2em,例如远离点框宽度 2.9 毫米的倍数,我们可以注意到跳过的差异:
- 更合理地设置为 6 毫米,例如大约是点框宽度的两倍:
- 带有首字母缩略词的示例,偏移量为 0,因为没有描述:
(符号和首字母缩略词示例之间的转换是因为它们分别位于奇数页和偶数页)