我想定义一个宏来在方程式下添加自动符号解释。我必须使用预定义的词汇表条目,因为不允许\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}
\eappto
提供的命令(etoolbox
由 自动加载glossaries
)可确保标签被扩展,但是诸如 之类的笨拙的命令\gls
需要使用 来阻止其扩展\noexpand
。
\csname gls{\@tempb} \endcsname
代码编译,但没有显示任何输出。
它不会显示任何输出,因为它形成了一个未定义的命令名称。\csname gls\endcsname
扩展为,\gls
但\csname gls{\@tempb}\endcsname
扩展为一个名称包含文字括号的命令,该括号围绕着 的当前值\@tempb
。