Автоматизировать описание переменных уравнения с помощью глоссариев-символов

Автоматизировать описание переменных уравнения с помощью глоссариев-символов

Я пытаюсь автоматизировать описание таблиц уравнений с помощью -пакета glossaries. Я уже нашелэтотвопрос, но с одной стороны у меня это не сработало, а с другой кажется довольно сложным (по сравнению с моим текущим кодом).

Вот что у меня есть на данный момент:

\documentclass[parskip=half]{scrartcl}

\usepackage[T1]{fontenc}
\usepackage[nomain, symbols]{glossaries}
\usepackage{blindtext}
\usepackage{etoolbox}
\usepackage{multicol}

% \usepackage{showframe}
\newglossaryentry{alpha}{name={Alpha}, symbol={\ensuremath{\alpha}}, description={first symbol}}
\newglossaryentry{beta}{name={Beta}, symbol={\ensuremath{\beta}}, description={second symbol}}
\newglossaryentry{gamma}{name={Gamma}, symbol={\ensuremath{\gamma}}, description={third symbol}}
\makeglossaries

\newcommand{\addVarDesc}[1]{
    \renewcommand*\do[1]{\glsadd{##1}\makebox[0.5cm][r]{\glssymbol{##1}} ${}={}$ \glsname{##1}\\}
    \noindent with:\quad%
    \begin{minipage}[t]{.9\linewidth}
        \begin{multicols}{2}
            \docsvlist{#1}
        \end{multicols}
    \end{minipage}\par\medskip
}

\newcommand{\addVarDescTab}[1]{
    \renewcommand*\do[1]{\glsadd{##1}\glssymbol{##1} & \glsname{##1}\\}
    \noindent with:\quad%
    \begin{tabular}[t]{l@{${}={}$}l}
        \docsvlist{#1}
    \end{tabular}\par\medskip
}


\begin{document}
\printglossaries

\section{With multicols}
    \blindtext[1]
    \begin{equation}
        \alpha = \beta + \gamma
    \end{equation}
    \addVarDesc{alpha, beta, gamma}
    \blindtext[2]

\section{With tabular}
    \blindtext[1]
    \begin{equation}
        \alpha = \beta + \gamma
    \end{equation}
    \addVarDescTab{alpha, beta, gamma}
    \blindtext[2]
\end{document}

С такими результатами:


Результат с мультиколонками


Результат с табличной средой


Как видите, вариант multicol совершенно неуместен. Более того, сложнее выровнять записи одинаково. Но в этой версии мне нравится гибкость в количестве колонок.

В то время как табличная версия кажется мне более чистой в плане выравнивания элементов. Однако я трачу больше места по горизонтали.

Есть ли у вас идеи, как улучшить внешний вид? Одна из идей, которую я имел в виду, — это разделить таблицы на две таблицы рядом. Но я не знаю, как реализовать это с помощью команды \docsvlist.

Любые идеи приветствуются!

решение1

Я бы сохранил описание внутри дисплея, чтобы избежать лишнего пространства между уравнением и описанием.

Также мы читаем слева направо (на английском языке). Можно было бы получить

alpha   gamma
beta

но я не склонен этого делать.

Я решаю это с помощью expl3, который имеет много функций, которые очень удобны. Во-первых, я сохраняю список в последовательности, которая может быть сопоставлена ​​с индексом элементов, поэтому я могу решить, выдавать ли \\(в конце строки) или &при добавлении элементов в переменную, которая хранит тело для следующего tabular.

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[nomain, symbols]{glossaries}
\usepackage{xparse}

\usepackage{lipsum}


\newglossaryentry{alpha}{
  name={Alpha},
  symbol={\ensuremath{\alpha}},
  description={first symbol}
}
\newglossaryentry{beta}{
  name={Beta},
  symbol={\ensuremath{\beta}},
  description={second symbol}
}
\newglossaryentry{gamma}{
  name={Gamma},
  symbol={\ensuremath{\gamma}},
  description={third symbol}
}
\makeglossaries

\ExplSyntaxOn

\NewDocumentCommand{\addVarDesc}{O{2}m}
 {% #1 = number of columns (default 2), #2 = list of keys
  \wulle_vardesc:nn { #1 } { #2 }
 }

\seq_new:N \l__wulle_vardesc_vars_seq
\tl_new:N \l__wulle_vardesc_body_tl

\cs_new_protected:Nn \wulle_vardesc:nn
 {
  \\\notag
  \begin{minipage}{\displaywidth}
  \seq_set_from_clist:Nn \l__wulle_vardesc_vars_seq { #2 }
  \tl_clear:N \l__wulle_vardesc_body_tl
  \seq_indexed_map_inline:Nn \l__wulle_vardesc_vars_seq
   {
    \tl_put_right:Nn \l__wulle_vardesc_body_tl
     {
      \glsadd{##2}\makebox[0.5cm][r]{\glssymbol{##2}} ${}={}$ \glsname{##2}
     }
    \int_compare:nTF { \int_mod:nn { ##1 } { #1 } = 0 }
     {
      \tl_put_right:Nn \l__wulle_vardesc_body_tl { \\ }
     }
     {
      \tl_put_right:Nn \l__wulle_vardesc_body_tl { & }
     }
   }
  with:~\begin{tabular}[t]{@{}*{#1}{l}@{}} \l__wulle_vardesc_body_tl \end{tabular}
  \end{minipage}
 }

\ExplSyntaxOff


\begin{document}

\printglossaries

\lipsum[1][1-3]
\begin{gather}
\alpha = \beta + \gamma
\addVarDesc{alpha, beta, gamma}
\end{gather}
\lipsum[2][1-3]
\begin{gather}
\alpha = \beta + \gamma
\addVarDesc[3]{alpha, beta, gamma}
\end{gather}
\lipsum[3][1-3]
\begin{gather}
\alpha = \beta + \gamma
\addVarDesc[1]{alpha, beta, gamma}
\end{gather}
\lipsum[4][1-3]

\end{document}

введите описание изображения здесь

Связанный контент