从可选默认参数扩展 \def 值?- \oldacronym 中的错误(词汇表 v4.02)- 第一次使用不受尊重且效果奇怪?

从可选默认参数扩展 \def 值?- \oldacronym 中的错误(词汇表 v4.02)- 第一次使用不受尊重且效果奇怪?

编辑:仅在词汇表 v4.02 中存在错误。-> 更新!

\edef\args{[#4]{#1}{#2}{#3}}% \expandafter\newacronym\args%

可能是扩展未扩展参数的一种方法。

词汇表包中是否存在错误?是否有类似方法\newcommand{\oldacronym}[4][\autoexpand\gls@label]{% ...可以修复此问题。可以\detokenize使用吗?如何使用?

\documentclass{article}

\RequirePackage{glossaries}    
\makeglossaries

\oldacronym[ABC]{ABC}{ABC working}{description={foo}}
%\oldacronym[DEF]{DEF}{DEF working}{description={bar}}
\oldacronym{DEF}{DEF not working}{description={bar}}
\oldacronym[GHI]{GHI}{GHI not working}{description={baz}}
\oldacronym[JKL]{JKL}{JKL working}{description={faz}}

\begin{document}

\noindent%
\ABC\\ \ABC\\ \ABC\\
\DEF\\ \DEF\\ \DEF\\
\GHI\\ \GHI\\ \GHI\\
\JKL\\ \JKL\\ \JKL\\

\printglossary

\end{document}

尝试注释掉 \DEF 的不同定义并观察。

从我目前调试的情况来看,[ \gls@label] 似乎没有正确扩展为 #1,\newacronym[#4]{#1}{#2}{#3}因此所有 oldacronym 条目似乎都以“\gls@label”作为键而不是其值。

这是 \oldacronym 的定义词汇表.sty

\newcommand{\oldacronym}[4][\gls@label]{%
  \def\gls@label{#2}%
  \newacronym[#4]{#1}{#2}{#3}%
  \ifcsundef{xspace}%
  {%
    \expandafter\edef\csname#1\endcsname{%
      \noexpand\@ifstar{\noexpand\Gls{#1}}{\noexpand\gls{#1}}%
    }%
  }%
  {%
    \expandafter\edef\csname#1\endcsname{%
      \noexpand\@ifstar{\noexpand\Gls{#1}\noexpand\xspace}{%
      \noexpand\gls{#1}\noexpand\xspace}%
    }%
  }%
}

有没有类似的东西\newcommand{\oldacronym}[4][\autoexpand\gls@label]{% ...\newacronym[#4]{\autoexpand{#1}}{#2}{#3}% ...可以解决这个问题?

错误:错误的 正确:正确的

答案1

我找到了一个解决方案,但我不确定它是否干净;而且#1 in \newacronym[#4]{#1}{#2}{#3}% ...从我的角度来看,适当扩展之类的做法会更加优雅。

\makeatletter
\def\ifemptyarg#1{%
  \if\relax\detokenize{#1}\relax % H. Oberdiek
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi}

\renewcommand{\oldacronym}[4][]{%
  \ifemptyarg{#1}
  {%
    \def\gls@label{#2}%
    \newacronym[#4]{#2}{#2}{#3}%
  }
  {%
    \def\gls@label{#1}%
    \newacronym[#4]{#1}{#2}{#3}%
  }%
  %
  \ifcsundef{xspace}%
  {%
    \expandafter\edef\csname \gls@label\endcsname{%
      \noexpand\@ifstar{\noexpand\Gls{\gls@label}}{\noexpand\gls{\gls@label}}%
    }%
  }%
  {%
    \expandafter\edef\csname \gls@label\endcsname{%
      \noexpand\@ifstar{\noexpand\Gls{\gls@label}\noexpand\xspace}{%
      \noexpand\gls{\gls@label}\noexpand\xspace}%
    }%
  }%
}
\makeatother

答案2

下面的方法似乎有效,有人可以向我解释一下这是否可以用作一种通用技术来扩展所有参数,然后再将它们传递给另一个命令吗?

\makeatletter
\renewcommand{\oldacronym}[4][\gls@label]{%
  \def\gls@label{#2}%
  %
  \edef\args{[#4]{#1}{#2}{#3}}%
  \expandafter\newacronym\args%
  %
  \ifcsundef{xspace}%
  {%
    \expandafter\edef\csname#1\endcsname{%
      \noexpand\@ifstar{\noexpand\Gls{#1}}{\noexpand\gls{#1}}%
    }%
  }%
  {%
    \expandafter\edef\csname#1\endcsname{%
      \noexpand\@ifstar{\noexpand\Gls{#1}\noexpand\xspace}{%
      \noexpand\gls{#1}\noexpand\xspace}%
    }%
  }%
}
\makeatother

相关内容