我想重新定义\ref
为 的行为,\cref
同时仍允许\ref*
将其用于 的标准行为\ref
。这是我实现此目标的尝试;我想使用注释行而不是未注释的行,但不幸的是我得到了一个错误。我创建带星号的命令的参考如下:https://texfaq.org/FAQ-cmdstar
\documentclass{article}
\usepackage{cleveref}
\let\oldref\ref
\renewcommand{\ref}{%
\makeatletter
\@ifstar
\oldref%
\cref%
\makeatother
}
\begin{document}
\begin{equation}
\label{eqn:2.2.4}
2 + 2 = 4
\end{equation}
\oldref{eqn:2.2.4}
\cref{eqn:2.2.4}
% \ref{eqn:2.2.4}
% \ref*{eqn:2.2.4}
\end{document}
答案1
不要将\makeatletter
和\makeatother
放在 里面\renewcommand
。这样做会失败,原因有二:
\@ifstar
视为\makeatother
下一个字符,而不是*
可能跟随或不跟随的字符。当 TeX 处理定义的内容时, 的 catcode
@
已经被读取(并设置为 12(其他))。(因此您实际上将其定义为\@
后跟字母ifstar
。
正确的定义是
\makeatletter
\renewcommand*{\ref}{\@ifstar\oldref\cref}
\makeatother
(*
此处使用的参考\newcommand 和 \newcommand* 之间有什么区别?)