实现以下目标的最简单方法是什么?我想要一个命令,比如说,如果所有参数都在引用列表中,则\vcref
自动变为,否则变为。请不要发表评论。谢谢!\citet
\cref
you 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:somthing
和fig:somethingelse
)Doe98
,并且您意识到其他潜在问题,我会说去做吧。
编辑
由于\citet
接受选项并且具有带星号的变体,但\cref
没有,因此在每个变体中添加了一行以区分两者(如果\omniref
后面跟着星号或有选项,则\citet
使用 ,否则将比较键)。此外,%
还添加了缺失的 s 以删除额外的空格。
编辑
根据以下评论,增加了与hyperref
和 的兼容性autonum
。