使用 alttree 样式减少词汇表中子条目的左边距水平间距

使用 alttree 样式减少词汇表中子条目的左边距水平间距

我正在尝试更改词汇表中的水平间距。更具体地说,

  • 我正在使用glossaries-extrawith bib2gls,使用altree风格;
  • 词汇表中有父条目和子条目;
  • 希望减少子条目左边距的水平间距。

当前,子节点的名称从父节点的描述开始的位置开始(参见带注释的输出)。

问:我想将子节点名称向左移动更多(并将子节点描述向左移动)。否则,alttree需要样式。

请参阅以下带注释的输出以获得更多说明。

带注释的输出

努力

我的部分解决方案(不是一个可行的解决方案是将以下代码添加到序言中。

\glssetwidest[1]{mmmmmm} % modify to move description to the left
\renewcommand*{\glstreenamebox}[2]{%
    \ifnum\glscurrententrylevel=1 % is supposed to check if entry is a child
    \makebox[#1][l]{\hspace{-10em}#2} % move name to left if is child
    \else
    \makebox[#1][l]{#2} %default value
    \fi
}

然而,这似乎总是\glscurrententrylevel=1正确的。尽管有一个父节点(它不应该是 0 级吗?)和一个子节点。

平均能量损失(无需上述努力):

\documentclass[12pt]{book}
\usepackage{tocloft} % for dots in glossary

\usepackage[record, stylemods={default}, style={alttree}, toc=false]{glossaries-extra} %glossary package (with bib2gls)
\GlsXtrLoadResources[src={exampleentries}, break-at={none},type={main}] % loading glossary file exampleentries.bib

% Formatting glossary
\glssetcategoryattribute{general}{glossnamefont}{textbf} % entry name in boldface
\glssetcategoryattribute{general}{glossdescfont}{textit} % entry description in italic
\renewcommand{\cftchapleader}{\cftdotfill{\cftsecdotsep}} % dots in glossary
\renewcommand*\glspostdescription{\cftdotfill{\cftsecdotsep}} % dots in glossary

\usepackage[a4paper]{geometry} % for margin changing
\newgeometry{margin=2.5cm} % reasonable 2.5 cm margin

\overfullrule=10mm % black box if margin exceeded

\begin{document}

Example text with \gls*{longest-entry-in-glossary} and \gls*{child-of-longest-entry}. And \gls*{some-other-entry}. % example text

\renewcommand{\glossarypreamble}{\glsfindwidesttoplevelname[\currentglossary]} %spacing between name and description
{\footnotesize \printunsrtglossary[type=main]} %print glossary

\end{document}

文件exampleentries.bib

@entry{longest-entry-in-glossary,
name={This is the longest entry name in here},
text={The longest},
description={Description goes here}
}

@entry{child-of-longest-entry,
parent={longest-entry-in-glossary},
name={Name of child is here},
text={child node},
description={Description goes here too, but may be too long otherwise}
}

@entry{some-other-entry,
name={Name of another entry},
text={another entry},
description={Description foo}
}

答案1

尝试添加序言:

\glssetwidest[1]{mm} % modify to move description to the left (essentially "mm" longest name of child entries, where "mm" is ficticious)
\renewcommand*{\glstreenamebox}[2]{% modifying \glstreenamebox accordingly
    \glsxtrifhasfield{parent}% if-clause
    {\glscurrententrylabel}% checking to see if a correspoding entry with \glscurrententrylabel in exampleentries.bib has "parent=", i.e. if it's a child
    {\makebox[#1][l]{\makebox[#1][l]{\hspace{-10em}#2}}}% if it is a child, move to the left by 10 em (change as necessary)
    {\makebox[#1][l]{#2}}} % if it is not a child, default value of \glstreenamebox

此处,\glssetwidest用于控制一级(子级)名称与描述之间的距离。您可以mm相应地修改为其他长度的字符串。

用于\renewcommand*{\glstreenamebox}更改名称与左边距的距离。\glstreenamebox无论条目是否为子条目,都会使用,因此我们需要在重新定义内使用 if 子句。这就是 实现的功能\glscurrententrylabel{<field>}{<entry label>}{<do-if-true>}{<do-if-false>}。我们需要在执行任何操作之前确定条目是否为子条目。

  • 如果词汇表中的当前条目(由 提供\glscurrententrylabel)有父条目,则它将在文件parent=中有exampleentries.bib。因此,对于普通词汇表,如果该字段parent存在,则它就是子条目;否则不是。

如果是子项,我们将在前面添加\hspace{-10em},并将子项的名称向左移动10 em。否则,我们保留 的默认值,\glstreenamebox此处为\makebox[#1][l]{#2}}10 em根据需要进行修改。

对序言进行了修改的 MWE 输出

相关内容