创建一个 3 列表格词汇表,其中 {glossaries} 占整个宽度

创建一个 3 列表格词汇表,其中 {glossaries} 占整个宽度

我有这个 MWE,我想将其用于我的词汇表。问题是第三列的宽度取决于\setlength{\glsdescwidth}{12cm}文档类别的页边距,哪个会起作用/不会起作用。

我想右列使用完整可用的页面宽度左栏和中栏已适应显示内容的需要。我理解ltxtable或者tabularx可以利用它,但我就是不知道如何正确使用。有人能给我指明正确的方向吗?

\documentclass{article}
\usepackage{lipsum}
\usepackage{siunitx}

\usepackage[acronym,toc]{glossaries}              % use glossaries-package
\setlength{\glsdescwidth}{12cm}
\usepackage{glossary-longbooktabs}

\newglossary[slg]{unitlist}{syi}{syg}{Verzeichnis der Kurzzeichen} % create add. symbolslist
\glsaddkey{unit}{\glsentrytext{\glslabel}}{\glsentryunit}{\GLsentryunit}{\glsunit}{\Glsunit}{\GLSunit}
\makeglossaries                                   % activate glossaries-package

%===================================================================
%Einträge Einheitenverzeichnis
%===================================================================

   \newglossaryentry{m}{name=\ensuremath{m},
    description={Meter},
    unit={\si{m}},
    type=unitlist}

    \newglossaryentry{symb:Pi}{name=\ensuremath{\pi},
    description={Geometrischer Wert},
    unit={},
    type=unitlist}

    \newglossaryentry{energyconsump}{
    name=\ensuremath{P},
    description={Leistung},
    unit={\si{kW}},
    type=unitlist}

\glsnoexpandfields
 \newglossaryentry{sqkm}{
    name=\ensuremath{A},
    description=Quadratkilometer Quadratkilometer Quadratkilometer Quadratkilometer Quadratkilometer,
    unit=\si{\square\kilo\metre},
    type=unitlist}

%===================================================================
%Stilvorlage
%===================================================================

\newglossarystyle{3colger}{%
    \setglossarystyle{longragged3col}% base this style on the list style
    \renewenvironment{theglossary}{% Change the table type --> 3 columns
        \begin{longtable}{l l p{\glsdescwidth}}}%
        {\end{longtable}}%
    %
    \renewcommand*{\glossaryheader}{%  Change the table header
        \bfseries Zeichen & \bfseries Einheit & \bfseries Beschreibung \\
        %       \hline
        \vspace{0.05cm}
        \endhead}
    \renewcommand*{\glossentry}[2]{%  Change the displayed items
        \glstarget{##1}{\glossentryname{##1}} %
        & \glsunit{##1} 
        &  \glossentrydesc{##1}  \tabularnewline
    }
}

\begin{document}
    \lipsum[2-4]
\glsaddall
\printglossary[type=unitlist,style=3colger] 
\end{document}

\setlength{\glsdescwidth}{12cm}如果没有正确选择,则会是这样的:在此处输入图片描述

答案1

假设“Zeichen”比任何名称都宽,“Einheit”比任何单位都宽,那么宽度可以计算为行宽-“Zeichen”的宽度-“Einheit” 的宽度-列间距。列间空间由 决定。(在列的两边插入\tabcolsep宽度为 的空间,这意味着列之间的空间实际上是,因此对于三列,总的列间空间是,其中包括第一列之前和最后一列之后的空间。)列标题文本的宽度可以使用 来计算。\tabcolsep2\tabcolsep6\tabcolsep\settowidth

\newglossarystyle{3colger}{%
    \setglossarystyle{longragged3col}% base this style on the list style
    \renewenvironment{theglossary}{% Change the table type --> 3 columns
     % compute the description width
        \settowidth{\dimen0}{\bfseries Zeichen}%
        \settowidth{\dimen1}{\bfseries Einheit}%
        \glsdescwidth=\dimexpr\linewidth-\dimen0-\dimen1-6\tabcolsep\relax
        \begin{longtable}{l l p{\glsdescwidth}}}%
        {\end{longtable}}%
    %
    \renewcommand*{\glossaryheader}{%  Change the table header
        \bfseries Zeichen & \bfseries Einheit & \bfseries Beschreibung \\
        %       \hline
        \vspace{0.05cm}
        \endhead}
    \renewcommand*{\glossentry}[2]{%  Change the displayed items
        \glstarget{##1}{\glossentryname{##1}} %
        & \glsunit{##1}
        &  \glossentrydesc{##1}  \tabularnewline
    }
}

得出的结果为:

词汇表图片

\tabcolsep由于在第一列之前和最后一列之后自动插入了空格(宽度为),因此与文本不齐平。可以使用 删除这些空格@{},并且需要调整计算以仅减去4\tabcolsep而不是6\tabcolsep

\newglossarystyle{3colger}{%
    \setglossarystyle{longragged3col}% base this style on the list style
    \renewenvironment{theglossary}{% Change the table type --> 3 columns
        \settowidth{\dimen0}{\bfseries Zeichen}%
        \settowidth{\dimen1}{\bfseries Einheit}%
        \glsdescwidth=\dimexpr\linewidth-\dimen0-\dimen1-4\tabcolsep\relax
        \begin{longtable}{@{}l l p{\glsdescwidth}@{}}}%
        {\end{longtable}}%
    %
    \renewcommand*{\glossaryheader}{%  Change the table header
        \bfseries Zeichen & \bfseries Einheit & \bfseries Beschreibung \\
        %       \hline
        \vspace{0.05cm}
        \endhead}
    \renewcommand*{\glossentry}[2]{%  Change the displayed items
        \glstarget{##1}{\glossentryname{##1}} %
        & \glsunit{##1}
        &  \glossentrydesc{##1}  \tabularnewline
    }
}

现在产生:

文件图像

回答您的评论,您原来的 12cm 值太长了。它几乎是整个文本宽度,这意味着您没有考虑前两列的宽度。如果我们对您的原始 MWE 进行微小修改,您就会看到这一点:

\newglossarystyle{3colger}{%
    \setglossarystyle{longragged3col}% base this style on the list style
    \renewenvironment{theglossary}{% Change the table type --> 3 columns
        \noindent\rule{\glsdescwidth}{1pt}\par% add rule for debugging
        \begin{longtable}{@{}l l p{\glsdescwidth}@{}}}%
        {\end{longtable}}%
    %
    \renewcommand*{\glossaryheader}{%  Change the table header
        \bfseries Zeichen & \bfseries Einheit & \bfseries Beschreibung \\
        %       \hline
        \vspace{0.05cm}
        \endhead}
    \renewcommand*{\glossentry}[2]{%  Change the displayed items
        \glstarget{##1}{\glossentryname{##1}} %
        & \glsunit{##1}
        &  \glossentrydesc{##1}  \tabularnewline
    }
}

这会在词汇表开始之前添加 12cm 的规则,以便您可以将其与表格进行比较:

带有 12 厘米宽描述栏的词汇表图像

因此,第三列(描述列)遵循 的值\glsdescwidth,但该值太宽。更改序言中的长度

\setlength{\glsdescwidth}{5cm}

反映在更新的文件中:

带有 5 厘米宽描述栏的词汇表图像

现在回到我对您的 MWE 的修改:

\renewenvironment{theglossary}{%
 % compute the description width
    \settowidth{\dimen0}{\bfseries Zeichen}%
    \settowidth{\dimen1}{\bfseries Einheit}%
    \glsdescwidth=\dimexpr\linewidth-\dimen0-\dimen1-6\tabcolsep\relax
    \begin{longtable}{@{}l l p{\glsdescwidth}@{}}}%
    {\end{longtable}}%

\glsdescwidth在显示词汇表之前明确计算,这意味着序言中对此长度的任何更改都将(本地)被词汇表样式覆盖。

相关内容