用一个命令替换 \citet 和 \cref(懒惰的极致)

用一个命令替换 \citet 和 \cref(懒惰的极致)

实现以下目标的最简单方法是什么?我想要一个命令,比如说,如果所有参数都在引用列表中,则\vcref自动变为,否则变为。请不要发表评论。谢谢!\citet\crefyou don't want to do this

\documentclass{article}

\usepackage{natbib}
\usepackage{cleveref}
\bibliographystyle{whateverstyle}

\begin{document}
\bibliography{refcite}
\begin{equation} \label{myeq}
 y=x
\end{equation}
\citet{ugh} found that \cref{myeq} can hold.
\end{document}

答案1

我支持在“可以”之后使用“应该”。您可以r@key相当轻松地采用另一种方法(检查任何参数是否是标签,如 所定义):

\documentclass{article}
\usepackage{natbib}
\bibliographystyle{whateverstyle}

\usepackage{etoolbox}
\usepackage{amsmath}
\usepackage{hyperref}
\usepackage{cleveref}
\usepackage{autonum}        

\makeatletter
    \def\omniref{\@ifnextchar[{\citet}{\@ifstar{\citet}{\omni@ref}}}
    \def\omni@ref#1{%
        \newif\iflbl\lblfalse
        \def\do##1{\@ifundefined{r@##1}{}{\lbltrue}}%
        \docsvlist{#1}%
        \iflbl\cref{#1}\else\citet{#1}\fi}
    \AtBeginDocument{\@ifpackageloaded{autonum}{\autonum@generatePatchedReferenceCSL{omniref}}{}}
\makeatother

%

\begin{document}
\bibliography{refcite}
\begin{equation}\label{aeqn}
 y=x
\end{equation}
\omniref{vanLoosdrecht99} found that \omniref{aeqn,eqn2} can hold.

\begin{equation}\label{eqn2}
 y=x
\end{equation}

\begin{thebibliography}{1}

\bibitem[{van Loosdrecht and Henze(1999)}]{vanLoosdrecht99}
van Loosdrecht, M. C.~M., Henze, M., 1999. Maintenance, endogeneous
  respiration, lysis, decay and predation. Water Science and Technology 39~(1),
  107--117.

\end{thebibliography}
\end{document}

编辑

假设参考书目条目定义为b@citekey,你提出的方法也是可行的。如果全部条目在参考书目中被引用,则使用以下内容\citet;如果没有,\cref则使用:

\documentclass{article}
\usepackage{natbib}
\bibliographystyle{whateverstyle}

\usepackage{etoolbox}
\usepackage{amsmath}
\usepackage{hyperref}
\usepackage{cleveref}
\usepackage{autonum}        

\makeatletter
    \def\omniref{\@ifnextchar[{\citet}{\@ifstar{\citet}{\omni@ref}}}
    \def\omni@ref#1{%
        \newif\ifbib\bibtrue
        \def\do##1{\@ifundefined{b@##1}{\bibfalse}{}}%
        \docsvlist{#1}%
        \ifbib\citet{#1}\else\cref{#1}\fi}
    \AtBeginDocument{\@ifpackageloaded{autonum}{\autonum@generatePatchedReferenceCSL{omniref}}{}}
\makeatother

%

\begin{document}
\bibliography{refcite}
\begin{equation}\label{aeqn}
 y=x
\end{equation}
\omniref{vanLoosdrecht99} found that \omniref{aeqn,eqn2} can hold.

\begin{equation}\label{eqn2}
 y=x
\end{equation}

\begin{thebibliography}{1}

\bibitem[{van Loosdrecht and Henze(1999)}]{vanLoosdrecht99}
van Loosdrecht, M. C.~M., Henze, M., 1999. Maintenance, endogeneous
  respiration, lysis, decay and predation. Water Science and Technology 39~(1),
  107--117.

\end{thebibliography}
\end{document}


\end{document}

产量:

例子

至于“应该”:显然,这偏离了惯例,可能会使解释错误变得更加困难。最大的潜在问题是,如果您的标签和引文具有相同的键,这可能会导致意外行为。但是,如果您对标签和引文使用足够不同的命名约定,以便您仍然能够推断命令的意图并消除重叠(例如,eqn:somthingfig:somethingelseDoe98,并且您意识到其他潜在问题,我会说去做吧。

编辑

由于\citet接受选项并且具有带星号的变体,但\cref没有,因此在每个变体中添加了一行以区分两者(如果\omniref后面跟着星号或有选项,则\citet使用 ,否则将比较键)。此外,%还添加了缺失的 s 以删除额外的空格。

编辑

根据以下评论,增加了与hyperref和 的兼容性autonum

相关内容