我正在尝试更新 \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)