更新 \ref 命令不起作用

更新 \ref 命令不起作用

我正在尝试更新 \ref 命令以自动检测方程和图形。我的所有方程标签都以“eq:”开头,所有图形标签都以“fig:”开头。

所以我尝试了这种方法,但它对我来说不起作用:

\documentclass[a4paper, 12pt]{article}
\usepackage{graphicx}
\usepackage[colorlinks=true]{hyperref}

\makeatletter
% Is it equation? => add brackets
\newcommand\myref[1]{\in@{eq:}{#1} \ifin@ (\ref{#1}) \else \ref{#1} \fi }
\makeatother

%\let\ref\myref
\renewcommand{\ref}[1]{\myref{#1}}
\renewcommand{\cite}[1]{\myref{#1}}

\begin{document}
Cite to eq: \cite{eq:test}, cite to fig: \cite{fig:test} % WORK FINE, add brackets
Ref to eq: \ref{eq:test}, ref to fig: \ref{fig:test}     % DOESN'T WORK :-(

\begin{figure}
 \includegraphics[width=13cm]{img/test.png}
 \caption{test}
 \label{fig:test}
\end{figure}

\begin{equation}
 a = b
 \label{eq:test}
\end{equation}

\end{document}

输出是,\cite 的行为符合我的要求(如果标签以“eq”开头,则添加括号),但 \ref 却不符合要求。它忽略了我 :-(

(我在线程中受到启发\renewcommand{\cite} 不起作用;所以我也尝试了命令 \let)

我知道 \eqref,但是我在许多文档中都有 \ref,现在我想用括号突出显示方程式。

有什么想法吗?

谢谢。

答案1

\ref钩子中可能重新定义了某些东西(例如 hyperref)\AtBeginDocument。您可以尝试将定义移出序言。对于您要尝试执行的那种操作,我建议您检查包cleveref,它可以使用引用命令执行许多智能操作。

答案2

看来 Lev 是对的。在您发布的文档中,您的\ref宏从未被调用,因为它在 处再次被重新定义\begin{document}。如果您将定义移出序言,那么您将得到我所期望的结果:\ref调用\myref,这再次调用\ref,您将得到一个闭环,这将产生“TeX 容量超出”错误。您确实必须使用\let以避免这种情况:

\let\oldref\ref
\makeatletter
\newcommand\myref[1]{\in@{eq:}{#1} \ifin@ (\oldref{#1}) \else \oldref{#1} \fi }
\makeatother
\renewcommand{\ref}[1]{\myref{#1}}
\renewcommand{\cite}[1]{\myref{#1}}

将其放在 之后\begin{document},一切就如你所愿了。解释:将\let的原始定义保存到,然后可以在 中使用原始定义。这无法通过 实现。\ref\oldref\myref\newcommand

答案3

不要重新发明轮子;相反,使用实验室

写完之后,我发现你\cite也想重新定义。为什么?它的功能不一样,\ref而且已经有自己的风格了。

答案4

太棒了,它起作用了,非常感谢!

但是如果我使用 \myref 调用 \ref,我会收到此错误:

TeX capacity exceeded, sorry.

我不知道为什么,但也许它会产生循环 \ref-->\myref-->\ref-->\myref...

所以我直接使用这种方式(cref 自动在等式周围给出括号):

\usepackage{cleveref}
.
.
.    
\begin{document} \let\ref\cref

并且可以使用 \ref 来自动添加图形、表格、方程式和方程式括号。

如果您想更改标签名称,只需添加到序言中:

\crefname{equation}{singular}{plural}
\crefname{figure}{singular}{plural}

cleveref 手册(PDF)

相关内容