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