在逗号分隔列表的循环中重新定义命令

在逗号分隔列表的循环中重新定义命令

我想重新定义glossaries包的\gls命令以包含索引条目和用于格式化索引条目的可选参数。但是,此命令有很多变体(、、\gls等以及我自己定义的许多键),因此我想通过逗号分隔的列表循环此命令。我正在尝试使用及其命令来实现这一点。我的 MWE 如下:\glspl\glstextetoolbox\docsvlist

\documentclass{report}

\usepackage{glossaries}
\usepackage{imakeidx}
\usepackage{etoolbox}
\usepackage{xargs}

\renewcommand{\do}[1]{%
    \expandafter\newcommand%
        \csname oldgls#1\endcsname%
        \csname gls#1\endcsname%
    \expandafter\renewcommandx%
        \csname gls#1\endcsname%
        [2][2]%
        \csname oldgls#1\endcsname{##1}\index{##1##2}%
}
\docsvlist{pl,text}

\makeglossaries
\makeindex

\input{glossaryDefs} % A file defining myterm & anotherterm




\begin{document}

Some text \glspl{myterm}[|textbf] and some more text  \glstext{anotherterm}.

\printglossary
\printindex

\end{document}

但是,我得到了错误,Missing \begin{document}.我对 LaTeX 还很陌生,我怀疑这个例子中可能存在许多问题。任何帮助都将不胜感激。

答案1

当您调用 时\do{pl},会发生以下情况:

\expandafter\newcommand\csname oldglspl\endcsname\csname glspl\endcsname
\expandafter\renewcommandx\csname glspl\endcsname[2][2]%
  \csname oldglspl\endcsname{#1}\index{#1#2}

第一个\expandafter展开\csname,所以我们得到

\newcommand\oldglspl\csname glspl\endcsname
\expandafter\renewcommandx\csname glspl\endcsname[2][2]%
  \csname oldglspl\endcsname{#1}\index{#1#2}

结果是一长串的错误,因为这就像做

\newcommand\oldglspl{\csname}

这肯定不是您想要的。对于此应用程序,您需要的是\let,而不是\newcommand

尝试

\renewcommand{\do}[1]{%
  \csletcs{oldgls#1}{gls#1}%
  \expandafter\renewcommandx\csname gls#1\endcsname[2][2]{%
    \csname oldgls#1\endcsname{##1}\index{##1##2}%
  }%
}

第一条指令就可以了\let\oldglspl\glspl,这样就可以保存含义以供重新定义时使用\oldgspl

请注意,\csletcs由提供etoolbox;如果没有它,你应该这样做

\expandafter\let\csname oldgls#1\expandafter\endcsname\csname gls#1\endcsname

答案2

您需要将 \begin{document} 移动到 \makeindex 之后。但是我无法进行完整编译,因为您没有提供 glossaryDefs.tex 文件。MWE 问题。

相关内容