当我在数学模式中的环境中使用 的命令(或类似命令)smartref
时出现错误。MWE:\sectionref
amsmath
\text{...}
\documentclass{article}
\usepackage{amsmath}
\usepackage{smartref}
\addtoreflist{section}
% see below for what this is for.
\addtoreflist{subsection}
\begin{document}
\section{Foosec} \label{hello}
% Works:
\sectionref{hello}
% Works:
$\sectionref{hello}$
% Does /not/ work:
% ! Argument of \@car has an extra }.
% or just hangup, depending on whether \addtoreflist{subsection} above
% is active.
$\text{\sectionref{hello}}$
\end{document}
有什么想法吗?(我的用例是将对定理的解释性引用放在等号之上)
答案1
我相信当为假\@getsmartref
时中\iffirstchoice@
和可以解决问题。该命令\text
必须构建相同文本的四个副本,其中一个最终将被使用。因此,为了不做错事,它引入了一个条件\iffirstchoice@
并进行修补\addtocounter
,以便在排版最后三个框时不执行任何操作。
但是,\@getsmartref
依赖于改变计数器。不过,在排版第一个框时,只需要计算一次;在其他三个框中,所需的值已经知道。
因此我包围了和\@getsmartref
之间的代码。\iffirstchoice@
\fi
\documentclass{article}
\usepackage{amsmath}
\usepackage{smartref}
\usepackage{etoolbox}
\makeatletter
\pretocmd{\@getsmartref}{\iffirstchoice@}{}{}
\apptocmd{\@getsmartref}{\fi}{}{}
\makeatother
\addtoreflist{section}
\begin{document}
\section{Foosec}
\begin{equation}
1=1\label{foo}
\end{equation}
\begin{equation}
a+b=c\label{hello}
\end{equation}
\sectionref{hello}
$\text{\sectionref{hello}}_{\text{\sectionref{hello}}}$
\end{document}
假设由于某种原因,$\text{\refstepcounter{foo}something else}$
。如果\text
不采取预防措施,计数器将步进四次。因此,amstext
包重新定义\addtocounter
(宏\refstepcounter
依赖)以便它只执行一次工作。
不幸的是,smartref
它使用\addtocounter
而不是较低级别的命令来执行其任务。\advance
在这种情况下,使用本地计数器会更好。
更好的定义\@getsmartref
是
\newcount\sr@currsmartlistplace
\newcommand*{\@getsmartref}[3]{%Parameters are: #1: Where #2: Label, #3: place in list
\edef\@smartlistplace{#3}%
\sr@currsmartlistplace=\z@
\edef\@originalsmartlist{%
\expandafter\@getsmartreflist\csname sr@#2\endcsname{}{}}%
\edef\@currsmartlist{\@originalsmartlist}%
\loop%
\edef\@currsmartvalue{\expandafter\@car\@currsmartlist\@nil}%
\ifnum\sr@currsmartlistplace=\value{less@smartlist}%
\edef\@currsmartlist{\noexpand{\expandafter\@cdr\@currsmartlist\@nil\noexpand}}%
\else
\edef\@currsmartlist{\expandafter\@cdr\@currsmartlist\@nil}%
\fi
\ifnum\sr@currsmartlistplace<\@smartlistplace
\advance\sr@currsmartlistplace\@ne
\repeat
\edef#1{\@currsmartvalue}%
% \typeout{Got Smart Reference (place #3, value \@currsmartvalue)}%
}
在 中发现时无需任何特殊处理\text
。