假设我们有:
\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
查看标签是否符合预期。