Я пытаюсь создать многоколоночный стиль глоссария (с помощью glossaries
), который сможет обрабатывать длинные описания, но я не очень хорошо знаком с тем, как писать стиль глоссария, и не совсем понимаю, как это осуществить.
Мне бы хотелось иметь глоссарий с четырьмя столбцами; две пары аббревиатуры и описания. Если описание занимает больше одной строки, описание должно переноситься только в пределах своей собственной колонки, а колонка аббревиатуры должна пропускать столько строк, сколько необходимо, чтобы каждая аббревиатура была выровнена с началом ее описания.
Все, что я знаю, как сделать, это создать два полных столбца и вручную отделить аббревиатуру от описания; с помощью этого кода (который, я почти уверен, я скопировал из StackExchange некоторое время назад):
\newglossarystyle{glossabbr}{%
\renewenvironment{theglossary}%
{\begin{multicols}{2}\raggedright}
{\end{multicols}}
\renewcommand*{\glossaryheader}{}
\renewcommand*{\glsgroupheading}[1]{}
\renewcommand*{\glsgroupskip}{}
\renewcommand*{\glsclearpage}{}
% set how each entry should appear:
\renewcommand*{\glossentry}[2]{
\noindent\makebox[7em][l]{\glstarget{##1}{\textsc{\glossentryname{##1}}}}
\glossentrydesc{##1}\\
}
\renewcommand*{\subglossentry}[3]{%
\glossentry{##2}{##3}
}
}
Проблема с этим кодом в том, что когда у вас длинное описание, оно просто переносится в столбец сокращений, потому что LaTeX не обрабатывает сокращение и описание как отдельные блоки. Вы можете увидеть проблему здесь, выделенную красным:
В конечном счете, все, что я хотел бы сделать, это просто взять эти обернутые биты описания (биты не в маленьких заглавных буквах) и засунуть их, ограничив их в колонке для описаний и оставив пробелы в колонке сокращений, где они находятся прямо сейчас. Как мне это сделать?
MWE с проблемным стилем глоссария:
\documentclass{article}
\usepackage[acronym,nomain]{glossaries}
\setacronymstyle{long-sc-short}
\makeglossaries
\newacronym
{inform}{inform}{informative illocutionary force}
\newacronym
{point}{point}{demonstrative illocutionary force}
\usepackage{multicol}
\newglossarystyle{glossabbr}{%
\renewenvironment{theglossary}%
{\begin{multicols}{2}\raggedright}
{\end{multicols}}
\renewcommand*{\glossaryheader}{}
\renewcommand*{\glsgroupheading}[1]{}
\renewcommand*{\glsgroupskip}{}
\renewcommand*{\glsclearpage}{}
% set how each entry should appear:
\renewcommand*{\glossentry}[2]{
\noindent\makebox[7em][l]{\glstarget{##1}{\textsc{\glossentryname{##1}}}}
\glossentrydesc{##1}\\
}
\renewcommand*{\subglossentry}[3]{%
\glossentry{##2}{##3}
}
}
\begin{document}
\glsunsetall
\gls{point}
\gls{inform}
\printglossary[style=glossabbr]
\end{document}
решение1
Это должно стать хорошим началом для комплексного решения:
\documentclass{article}
\usepackage[acronym,nomain]{glossaries}
\setacronymstyle{long-sc-short}
\makeglossaries
\newacronym
{inform}{inform}{informative illocutionary force}
\newacronym
{point}{point}{demonstrative illocutionary force}
\usepackage{multicol}
\newglossarystyle{glossabbr}{%
\renewenvironment{theglossary}%
{\begin{multicols}{2}\raggedright}
{\end{multicols}}
\renewcommand*{\glossaryheader}{}
\renewcommand*{\glsgroupheading}[1]{}
\renewcommand*{\glsgroupskip}{}
\renewcommand*{\glsclearpage}{}
% set how each entry should appear:
\renewcommand*{\glossentry}[2]{
\noindent\makebox[7em][l]{\glstarget{##1}%
{\begin{minipage}[t]{0.2\textwidth}
\textsc{\glossentryname{##1}}
\end{minipage}
}}
\begin{minipage}{0.2\textwidth}
\glossentrydesc{##1}
\end{minipage}\\
}
\renewcommand*{\subglossentry}[3]{%
\glossentry{##2}{##3}
}
}
\begin{document}
\glsunsetall
\gls{point}
\gls{inform}
\printglossary[style=glossabbr]
\end{document}
Обратите внимание на добавленные minipage
среды вокруг glossentryname
и glossentrydesc
. Это своего рода сырой обходной путь.
Вам следует попробовать настроить среду под свои нужды — ширину можно увеличить (возможно, но это выглядит приемлемо), и у меня возникли проблемы с установкой вертикального выравнивания записи глоссария по верху, а не по центру.
Я оставляю это на ваше усмотрение ;)