我有这个 MWE:
\documentclass{article}
\usepackage[TS1,T1]{fontenc}
\usepackage[french]{babel}
\newcounter{nbrefpage}
\newcommand\setindex[1] {%
\stepcounter{nbrefpage}%
\def\tmpnbrefpage{\arabic{nbrefpage}testpage}%
\label{\tmpnbrefpage}%
\def\opt{#1}%
\ifcsname index:\opt\endcsname%EXISTS
\expandafter\xdef\csname index:\opt\endcsname{%
\unexpanded\expandafter{\csname index:\opt\endcsname}, %
\noexpand\pageref{\tmpnbrefpage}%
}%
\texttt{\expandafter\meaning\csname index:\opt\endcsname}%
\else%DOES NOT EXIST
\expandafter\xdef\csname index:\opt\endcsname{\noexpand\pageref{\tmpnbrefpage}}%
\texttt{\expandafter\meaning\csname index:\opt\endcsname}%
\fi%
}
\begin{document}
\setindex{paris}
\setindex{paris}
\end{document}
我得到:
macro:->\pageref {1testpage}
macro:->\index:paris , \pageref {2testpage}
我想获得:
macro:->\pageref {1testpage}
macro:->\pageref {1testpage} , \pageref {2testpage}
任何想法?
答案1
更换你的线路
\unexpanded\expandafter{\csname index:\opt\endcsname}, %
按行
\unexpanded\expandafter\expandafter\expandafter{\csname index:\opt\endcsname}, %
这里必须有三个,\expandafter
因为您想要 1. 替换\csname ...\endcsname
为控制序列和 2. 扩展此控制序列。
此外,你不需要在 中定义宏\tmpnbrefpage
。的定义应如下所示:\opt
\setindex
\setindex
\newcount\nbrefpage
\def\setindex #1{%
\global\advance\nbrefpage by1
\label{\the\nbrefpage testpage}%
\ifcsname index:#1\endcsname
\expandafter \xdef \csname index:#1\endcsname {%
\unexpanded \expandafter\expandafter\expandafter{\csname index:#1\endcsname}, %
\noexpand\pageref{\the\nbrefpage tespage}%
}%
\else \expandafter \xdef \csname index:#1\endcsname {%
\noexpand\pageref{\the\nbrefpage tespage}%
}%
\fi
{\tt \expandafter\meaning \csname index:#1\endcsname}%
}
答案2
你缺少几个\expandafter
标记:\x
扩展到\foo
代码
\unexpanded\expandafter{\csname x\endcsname}
变成
\unexpanded{\x}
因此\x
不会立即扩张。
和
\unexpanded\expandafter\expandafter\expandafter{\csname x\endcsname}
你首先得到
\unexpanded\expandafter{\x}
进而
\unexpanded{\foo}
并最终变得\foo
无法进一步扩展\xdef
。
有一个更简单的实现。
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[french]{babel}
\newcounter{nbrefpage}
\ExplSyntaxOn
\NewDocumentCommand{\setindex}{m}
{
\dufays_index_set:n { #1 }
}
\NewDocumentCommand{\deliverindex}{m}
{
\dufays_index_deliver:n { #1 }
}
\cs_new_protected:Nn \dufays_index_set:n
{
\seq_if_exist:cF { g_dufays_indes_#1_seq }
{
\seq_new:c { g_dufays_indes_#1_seq }
}
\refstepcounter{nbrefpage}\label{\thenbrefpage-index}
\seq_gput_right:cx { g_dufays_indes_#1_seq } { \exp_not:N \pageref{\thenbrefpage-index} }
}
\cs_new_protected:Nn \dufays_index_deliver:n
{
#1~\seq_use:cn { g_dufays_indes_#1_seq } { ,~ }
}
\ExplSyntaxOff
\begin{document}
\setindex{paris}
\deliverindex{paris}
\setindex{paris}
\deliverindex{paris}
\end{document}
\refstepcounter
如果您加载,您还将获得超链接hyperref
。