tabularx 中的词汇表

tabularx 中的词汇表

我正在尝试让一个词汇表样式与 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,但是我无法使它看起来与其他表格一样好看,尤其是包含长文本的列。

一些说明:

  • 我知道llMWE 中的列没有多大意义,但我试图在这里尽可能保持简单
  • 我想使用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包一样,在环境定义中使用\xltabularand\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 结合的词汇表!(但不要忘记设置样式;))

相关内容