我想使用 foreach 循环在 LaTeX 文档中创建首字母缩略词列表。我期望代码看起来应该像这样,但它不起作用(它几乎可以工作):
\documentclass{article}
\usepackage{pgffor}
\usepackage[acronym]{glossaries}
\makeglossaries
\foreach \x/\y in {
DOC/document,
ACR/acronym,
VV/very very,
}
{\newacronym{\x}{\x}{\y}}
\begin{document}
\section{Document Body}
A \gls{DOC} with lots of unexplained \glspl{ACR} is \gls{VV} annoying.
\printglossary[type=\acronymtype]
\end{document}
作为参考,这里有一个有效的 foreach 循环和首字母缩略词词汇表的示例:
\documentclass{article}
\usepackage{pgffor}
\usepackage[acronym]{glossaries}
\makeglossaries
\newacronym{DOC}{DOC}{document}
\newacronym{ACR}{ACR}{acronym}
\newacronym{VV}{VV}{very very}
\begin{document}
\section{Document Body}
A \gls{DOC} with lots of unexplained \glspl{ACR} is \gls{VV} annoying.
\section{Foreach Loop}
\foreach \x/\y in {
DOC/document,
ACR/acronym,
VV/very very,
}
{\textbf{\x} \y\\}
\printglossary[type=\acronymtype]
\end{document}
答案1
你需要扩大\x
和\y
在你把它们交给之前\newacronym
。
在这种情况下,它很简单
\foreach \x/\y in {
DOC/document,
ACR/acronym,
VV/very very%
}{%
\edef\z{\noexpand\newacronym{\expandonce\x}{\expandonce\x}{\expandonce\y}}%
\z
}
的名称\z
并不重要(它甚至可能是\x
或\y
),因为它在循环后被遗忘了。
但是要小心pgffor
,因为它的主体是分组的,所以本地分配将无法保留。glossaries
不过,该包显然是全局执行的。
使用 LaTeX3 时,您可以在使用它们之前先\exp_args:Nooo
扩展三个参数:o
\newacronym
\ExplSyntaxOn
\NewDocumentCommand\MakeAcronym{ m m }{
\exp_args:Nooo \newacronym#1#1#2
}
\ExplSyntaxOff
\foreach \x/\y in {
DOC/document,
ACR/acronym,
VV/very very%
}{%
\MakeAcronym{\x}{\y}%
}
如果你不需要使用全部功能\foreach
(主要是计算值和记住其他值),你可以使用.list
处理程序它仍然允许该...
语法(并不是说它在这里真正适用)。
这确实会在传递之前扩展值,/GJ/new acros
这就是为什么您可以(并且必须)使用#1
然后#2
。
代码
\documentclass{article}
\usepackage{pgffor}
\usepackage[acronym]{glossaries}
\makeglossaries
\pgfkeys{
GJ/new acros/.code args={#1/#2}{%
\newacronym{#1}{#1}{#2}%
},
GJ/new acros/.list={
DOC/document,
ACR/acronym,
VV/very very%
}
}
% \ExplSyntaxOn
% \NewDocumentCommand\MakeAcronym{ m m }{
% \exp_args:Nooo \newacronym#1#1#2
% }
% \ExplSyntaxOff
% \foreach \x/\y in {
% DOC/document,
% ACR/acronym,
% VV/very very%
% }{%
% \MakeAcronym{\x}{\y}%
% }
% \foreach \x/\y in {
% DOC/document,
% ACR/acronym,
% VV/very very%
% }{%
% \edef\z{\noexpand\newacronym{\expandonce\x}{\expandonce\x}{\expandonce\y}}%
% \z
% }
\begin{document}
\section{Document Body}
A \gls{DOC} with lots of unexplained \glspl{ACR} is \gls{VV} annoying.
\printglossary[type=\acronymtype]
\end{document}