默认使用巧妙的引用

默认使用巧妙的引用

我想重新定义\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。这样做会失败,原因有二:

  1. \@ifstar视为\makeatother下一个字符,而不是*可能跟随或不跟随的字符。

  2. 当 TeX 处理定义的内容时, 的 catcode@已经被读取(并设置为 12(其他))。(因此您实际上将其定义为\@后跟字母ifstar

正确的定义是

\makeatletter
\renewcommand*{\ref}{\@ifstar\oldref\cref}
\makeatother

*此处使用的参考\newcommand 和 \newcommand* 之间有什么区别?

相关内容