使用 LaTeX 词汇表中的 foreach 循环创建首字母缩略词列表

使用 LaTeX 词汇表中的 foreach 循环创建首字母缩略词列表

我想使用 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}

输出

在此处输入图片描述

相关内容