仅评估定义的一部分,而不评估其他部分

仅评估定义的一部分,而不评估其他部分

假设我们有:

\def\tmpnbrefpage{sometestpagetoken}

我们如何定义一个storedpageref变量,如(用伪语言):

"storedpageref" = \pageref{\tmpnbrefpage}

其中,tmpnbrefpage在定义时进行求值,但请注意\pageref{\tmpnbrefpage},也就是说,在我们的例子中,有:

"storedpageref" = \pageref{sometestpagetoken}

如果我设置\def\storedpageref{\pageref{\tmpnbrefpage}},当我调用时,\storedpageref我将得到最后一个\tmpnbrefpage。如果我设置\xdef\storedpageref{\pageref{\tmpnbrefpage}},我将出现错误:! Missing control sequence inserted. <inserted text> \inaccessible

这个问题可以通过这个问题来解决:我们如何example评估\def\A{here is an \example variable}

对于精通 tex 的高级人士来说,这个问题可能看起来很简单,但我还是很感激您的帮助。(我放松的头脑有时可以掌握“\expandafter”,但我必须说,我在这个小问题上犯了愚蠢的错误,而且我很难进行明智的思考)

编辑

假设我们有\xdef\storedpageref{\noexpand\pageref{\tmpnbrefpage}},我们如何重新定义以便:\storedpageref = \storedpageref, \noexpand\pageref{\tmpnbrefpage}}。以某种方式,如何添加, \noexpand\pageref{\tmpnbrefpage}}\storedpageref

这可能吗?@egreg 给我们 (重新定义 def 本身而不进行评估) 一个很好的解决方案,无需评估\tmpnbrefpage,因为这正是我想要表达的观点。但是,我们怎样才能在不评估的情况\xdef\storedpageref做到\tmpnbrefpage这一点\pageref{\tmpnbrefpage}}

新编辑 因此,我亲爱的 tex 拯救者们:

我想为书籍做一个简单的索引。因此,我做了以下操作:我将页面值存储到一个简单的变量中:

\newcommand\setindex[1] {%
    \def\opt{#1}%
    \ifcsname index:\opt\endcsname%EXISTS
        \expandafter\xdef\csname index:\opt\endcsname{\csname index:\opt\endcsname, \thepage}%
    \else%DOES NOT EXIST
        \expandafter\xdef\csname index:\opt\endcsname{\thepage}%
    \fi%
}

并简单地调用页面:

\newcommand\getindex[1] {%
   \def\opt{#1}%
   \expandafter \ifx \csname index:\opt\endcsname \relax \else%
      \space {\normalfont [~\csname index:\opt\endcsname~]~}\fi%

}

效果很好。

但是,\thepage计数器有时会给出错误的结果,因为文本在显示之前进行了编译。所以@David Carlisle 给了我一个很好的答案:设置一个标签,并用 pageref 调用引用。这很完美。

因此,我想以一种巧妙的方式进行修改。\thepage而且\pageref{\tmplabeltoken}......我不了解后果......对于变量来说,似乎很难理解其行为。有什么想法吗?非常感谢 :)

使用thepage,这很简单,因为我们在定义时就获取了值。但是使用标签,我们必须等待变量被打印出来才能评估pageref的命令。

因此,变量的内容必须是例如:pageref{24testpage}, pageref{89testpage}, etc.在索引中调用时。

新编辑

\newcounter{nbrefpage}
\newcommand\setindex[1] {%
    \stepcounter{nbrefpage}%
    \def\tmpnbrefpage{\arabic{nbrefpage}testpage}%
    \label{\tmpnbrefpage}%
    \def\opt{#1}%
    \ifcsname index:\opt\endcsname%EXISTS

    \else%DOES NOT EXIST
        \expandafter\xdef\csname index:\opt\endcsname{\noexpand\pageref{\tmpnbrefpage}}%
        \texttt{\expandafter\meaning\csname index:\opt\endcsname}
    \fi%
}

第一个电话setindex{paris}

macro:->\pageref {1testpage}

但是,如果存在,该设置什么?如果我们设置,\expandafter\xdef\csname index:\opt\endcsname{\csname index:\opt\endcsname, a}我们会得到一个错误! Incomplete \iffalse; all text was ignored after line 30. <inserted text> \fi

\noexpand\csname index:\opt\endcsname, a

macro:->\csname index:paris\endcsname , a

\expandafter\noexpand\csname index:\opt\endcsname, a给予macro:->\index:paris , a

也就是说变量包含其自身!所以,如果它被调用,我们就会得到! TeX capacity exceeded, sorry [input stack size=5000]....

我如何才能拥有:macro:->\pageref {1testpage}, a

如果我像@egreg 那样做:\unexpanded\expandafter{\csname index:\opt\endcsname}, a我也会得到macro:->\index:paris , a而不是macro:->\pageref {1testpage}, a...我不明白为什么我无法解决这个问题......

答案1

\xdef\storedpageref{\noexpand\pageref{\tmpnbrefpage}}

将会扩展\tmpnbrefpage但不是\pagref在定义时。

答案2

为什么不说明你真正的问题?你似乎想要积累\pageref语句,其中实际标签暂时存储在 中\tmpbrefpage

\pageref,我猜你正在使用 LaTeX。

\newcommand*{\storedpageref}{} % initialize
\newcommand{\addtostored}{%
  \ifx\storedpageref\empty
    \xdef\storedpageref{\noexpand\pageref{\tmpbrefpage}}%
  \else
    \xdef\storedpageref{%
      \unexpanded\expandafter{\storedpageref}, %
      \noexpand\pageref{\tmpbrefpage}%
    }%
  \fi
}

完整示例:

\documentclass{article}

\newcommand*{\storedpageref}{} % initialize
\newcommand{\addtostored}{%
  \ifx\storedpageref\empty
    \xdef\storedpageref{\noexpand\pageref{\tmpbrefpage}}%
  \else
    \xdef\storedpageref{%
      \unexpanded\expandafter{\storedpageref}, %
      \noexpand\pageref{\tmpbrefpage}%
    }%
  \fi
}

\begin{document}

\def\tmpbrefpage{aaa}

\addtostored

\texttt{\meaning\storedpageref}

\def\tmpbrefpage{bbb}

\addtostored

\texttt{\meaning\storedpageref}

\end{document}

在此处输入图片描述

一种不同的实现,您可以管理任意数量的列表并附加隐式值\tmpbrefpage或显式标签。

\documentclass{article}
\usepackage{showkeys}

\ExplSyntaxOn

\NewDocumentCommand{\newlistofrefs}{m}
 {
  \seq_new:c { g_dufays_refs_#1_seq }
 }

\NewDocumentCommand{\addtolistofrefs}{O{\tmpbrefpage}m}
 {
  \seq_gput_right:cx { g_dufays_refs_#2_seq } { \exp_not:N \pageref { #1 } }
 }

\NewDocumentCommand{\uselistofrefs}{m}
 {
  \seq_use:cn { g_dufays_refs_#1_seq } { ,~ }
 }

\ExplSyntaxOff

\newlistofrefs{main}

\begin{document}

\def\tmpbrefpage{aaa}

\addtolistofrefs{main}

\addtolistofrefs[qqq]{main}

\def\tmpbrefpage{bbb}

\addtolistofrefs{main}

\uselistofrefs{main}

\end{document}

在此处输入图片描述

我用来showkeys查看标签是否符合预期。

相关内容