用其自身重新定义一个定义,而不评估其内容

用其自身重新定义一个定义,而不评估其内容

我有这个 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

相关内容