使用词汇表创建自动符号方程式列表

使用词汇表创建自动符号方程式列表

我想定义一个宏来在方程式下添加自动符号解释。我必须使用预定义的词汇表条目,因为不允许\glsentrycurrent在文档中添加新的词汇表。为了添加自动图例,我定义了 newcommand \addLegeds,它基本上应该循环遍历作为参数传递的所有逗号分隔的字符串,并检查它们是否已被使用。如果它们都已被使用,则不应添加图例。宏可以正常工作,但只要我使用\gls\glsdesc宏,就会出现以下错误:

Argument of \@tempc has an extra }. \addLegends{test1,test2} 
File ended while scanning use of \@tempc.
Missing \endcsname inserted. \addLegends{test1,test2}
Paragraph ended before \@tempc was complete. \addLegends{test1,test2}
Undefined control sequence. \addLegends{test1,test2}

使用了以下宏:

\makeatletter
\newif\ifshowleg
\newcommand{\addLegends}[1]{%
    \showlegfalse
    \@for\@tempa:=#1\do{%
        \ifnumequal{\glsentrycurrcount{\@tempa}}{0}{\showlegtrue}{}}%
    \ifshowleg  %
        with: % 
        \begin{conditions} %
            \@for\@tempb:=#1\do{ %
                \ifnumequal{\glsentrycurrcount{\@tempb}}{0}{ %
                    \gls{\@tempb} & \glsdesc{\@tempb}\\ %
                }{}}%
        \end{conditions} %
     \else \fi %
}
\makeatother

这是乳胶文档的缩小版本:

\usepackage[toc]{glossaries}
\glsenableentrycount
% MACRO
    \newglossaryentry{test1}{name={test1},description={TEST1}}
    \newglossaryentry{test2}{name={test2},description={TEST2}}

\begin{document}
\addLegends{test1,test2}
\begin{end}

有人知道是什么导致了这个错误吗?

更新: 通过使用

\csname gls{\@tempb} \endcsname  \csname glsdesc{\@tempb} \endcsname %

代替:

\gls{\@tempb} & \glsdesc{\@tempb}\\

代码可以编译,但不会显示任何输出。将&后面的内容放在中间无法编译。有没有什么办法可以解决这两个问题?

答案1

您没有提供conditions环境的定义,但我猜它是 的一种形式tabular。由于我不知道它是什么,所以我用\begin{tabular}{ll}代替\begin{conditions}\end{tabular}代替\end{conditions}

循环在表格上下文中很棘手,在循环外构建内容和进行实际排版通常更简单:

\documentclass{scrartcl}
\usepackage{glossaries}

\makeatletter
\newif\ifshowleg
\newcommand{\addLegends}[1]{%
  \showlegfalse
  \def\leg@list{\begin{tabular}{ll}}%
  \@for\@tempa:=#1\do{%
    \ifnumequal{\glsentrycurrcount{\@tempa}}{0}%
    {\showlegtrue\eappto\leg@list{\noexpand\gls{\@tempa} 
      \noexpand& \noexpand\glsentrydesc{\@tempa}\noexpand\\}}{}%
  }%
  \appto\leg@list{\end{tabular}}%
  \ifshowleg    
      with: \leg@list
  \fi 
}
\makeatother

\glsenableentrycount
\newglossaryentry{test1}{name={test1},description={TEST1}}
\newglossaryentry{test2}{name={test2},description={TEST2}}

\begin{document}
\addLegends{test1,test2}
\end{document}

with: test 1 TEST1 test2 TEST2

\eappto提供的命令(etoolbox由 自动加载glossaries)可确保标签被扩展,但是诸如 之类的笨拙的命令\gls需要使用 来阻止其扩展\noexpand

\csname gls{\@tempb} \endcsname

代码编译,但没有显示任何输出。

它不会显示任何输出,因为它形成了一个未定义的命令名称。\csname gls\endcsname扩展为,\gls\csname gls{\@tempb}\endcsname扩展为一个名称包含文字括号的命令,该括号围绕着 的当前值\@tempb

相关内容