smartref 包:从数学模式 \text{} 引用时出现问题

smartref 包:从数学模式 \text{} 引用时出现问题

当我在数学模式中的环境中使用 的命令(或类似命令)smartref时出现错误。MWE:\sectionrefamsmath\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

相关内容