我正在尝试让一个词汇表样式与 tabularx 兼容,但遇到了一些问题。我看到有人声称他们能够让它工作,而其他人则说词汇表永远无法与 tabularx 兼容(我还没有看到关于原因的解释)。
我整理了一份 MWE 来展示这个问题:
\documentclass[10pt, a4paper]{article}
\usepackage{tabularx}
\usepackage{hyperref}
\usepackage{glossaries}
\makeglossaries
\newglossarystyle{glostable}
{%
\renewenvironment{theglossary}%
{\begin{tabularx}{\linewidth}{ll}}%
{\end{tabularx}}%
\renewcommand*{\glossaryheader}{}%
\renewcommand*{\glsgroupheading}[1]{}%
\renewcommand*{\glsgroupskip}{}%
\renewcommand{\glossentry}[2]{%
\glossentryname{##1} & \glossentrydesc{##1} \\%
}%
\renewcommand*{\subglossentry}[3]{}%
}
\setglossarystyle{glostable}
\newglossaryentry{latex}
{
name=latex,
description={Is a mark up language specially suited for scientific documents}
}
\longnewglossaryentry{HTML}
{
name={Hypertext Markup Language (HTML)},
description={Hypertext Markup Language (HTML) is the standard markup language for documents designed to be displayed in a web browser. It can be assisted by technologies such as Cascading Style Sheets (CSS) and scripting languages such as JavaScript.},
first={Hypertext Markup Language (HTML)},
text={HTML}
}
\begin{document}
当我尝试编译此文档时(假设 makeglossaries 已成功运行),我在日志中看到以下错误
[...]
Runaway argument?
\glossarypostamble
! File ended while scanning use of \TX@get@body.
<inserted text>
\par
l.45 \printglossaries
?
! Emergency stop.
[...]
我曾尝试使用 longtable,但是我无法使它看起来与其他表格一样好看,尤其是包含长文本的列。
一些说明:
- 我知道
ll
MWE 中的列没有多大意义,但我试图在这里尽可能保持简单 - 我想使用tabularx,因为:
- 这就是我在文档其余部分使用的内容
- 我有一些带有长描述的项目,tabularx 可以让我很好地控制列
- 我将它与 ltablex 结合使用,用于重复标题
答案1
您不能在新环境定义中使用\begin{tabularx}
and 。请改用and 。\end{tabularx}
\tabularx
\endtabularx
可以在手册第 4 页找到相关提示tabularx
:
允许
\tabularx
\endtabularx
(但不能)在定义\begin{tabularx}
\end{tabularx}
中使用\newenvironment
将您的定义更改为
\newglossarystyle{glostable}
{%
\renewenvironment{theglossary}%
{\tabularx{\linewidth}{lX}}%
{\endtabularx}%
\renewcommand*{\glossaryheader}{}%
\renewcommand*{\glsgroupheading}[1]{}%
\renewcommand*{\glsgroupskip}{}%
\renewcommand{\glossentry}[2]{%
\glossentryname{##1} & \glossentrydesc{##1} \\%
}%
\renewcommand*{\subglossentry}[3]{}%
}
因此应该使你的代码可编译。
如果您希望词汇表占据多页,则可能需要切换到其他方法。如果您希望坚持使用带有X
类型列的两列表,但希望允许中间表格分页符,则可以xltabular
尝试一下。就像使用tabularx
包一样,在环境定义中使用\xltabular
and\endxltabular
而不是通常的\begin{xltabular}
and \end{xltabular}
。另一种选择可能是切换到类似列表的样式,例如定制alttree
风格。
答案2
对于那些到达这里的人,我想补充一下我最后是如何解决这个问题的。我将保留@leandriis的答案作为可接受的答案,因为它解释了为什么我的问题中的 mwe 不起作用和他提出了一个可行的解决方案。
但是,正如您在我的评论中看到的,当您将 tabularx 与 ltablex 一起使用以获得 longtable 功能时,解决方案会停止工作,它会再次停止工作。因此,我按照 Leandriis 的建议研究了 xltabular,并且......遇到了同样的问题。但是,在研究 xltabular 和词汇表时,我遇到了这个答案:https://tex.stackexchange.com/a/539737/45330建议使用该environ
软件包。实际上,它甚至基于使用与 tabularx 相同的技术的这个答案(!):https://tex.stackexchange.com/a/343239/45330
所以我最终得到了这样的结果:
\NewEnviron{glostableenviron}{%
\begin{tabularx}{\linewidth}{lX}%
\BODY
\end{tabularx}
\addtocounter{table}{-1} % prevent table counter to go up
}
\newglossarystyle{glostable}
{%
\renewenvironment{theglossary}%
{\glostableenviron}%
{\endglostableenviron}%
\renewcommand*{\glossaryheader}{}%
\renewcommand*{\glsgroupheading}[1]{}%
\renewcommand*{\glsgroupskip}{}%
\renewcommand{\glossentry}[2]{%
\glossentryname{##1} & \glossentrydesc{##1} \\%
}%
\renewcommand*{\subglossentry}[3]{}%
}
就这样,你就有了一个使用 tabularx 和 ltablex 结合的词汇表!(但不要忘记设置样式;))