从 nameref 中删除引用

从 nameref 中删除引用

我有一些定理/引理,它们的名称中有引用,如下所示:

\begin{lemma}[Park's Lemma~\textnormal{\protect{\cite{park}}}]\label{lemma:parks-lemma}
    This is Park's Lemma
\end{lemma}

现在,当我引用这个引理时,我只想引用名称,如下所示:

\nameref{lemma:parks-lemma}

现在,每次引用这个引理时,我也会得到名称中的引用,这是我不想要的。有什么方法可以告诉 nameref 跳过这部分吗?我正在使用amsthm

编辑:MWE:

\documentclass[12pt]{article}
\usepackage{hyperref}
\usepackage[capitalize,nameinlink]{cleveref}
\usepackage{amsthm}
\usepackage{nameref}
\theoremstyle{definition}
\newtheorem{definition}{Definition}[section]
\theoremstyle{plain}
\newtheorem{theorem}[definition]{Theorem}
\newtheorem{lemma}[definition]{Lemma}

\begin{filecontents}{references.bib}
@techreport{park,
  author    = {Park},
  title     = {Park's Lemma},
}
\end{filecontents}

\begin{document}
    \begin{lemma}[Park's Lemma~\textnormal{\protect{\cite{park}}}]\label{lemma:parks-lemma}
        This is Park's Lemma
    \end{lemma}
    
    Check out \nameref{lemma:parks-lemma}!
    
    \bibliographystyle{plain}
    \bibliography{references}
\end{document}

答案1

nameref 使用包 gettitlestring 来处理标题。你可以改变它的扩展方法,然后定义一个在这样的标题中被忽略的命令(nameref 是由 hyperref 加载的,所以不需要再次加载,而且你的 \protect 没有多大意义):

\documentclass[12pt]{article}
\usepackage{hyperref}
\usepackage[capitalize,nameinlink]{cleveref}
\usepackage{amsthm}
\theoremstyle{definition}
\newtheorem{definition}{Definition}[section]
\theoremstyle{plain}
\newtheorem{theorem}[definition]{Theorem}
\newtheorem{lemma}[definition]{Lemma}

\begin{filecontents}[force]{references.bib}
@techreport{park,
  author    = {Park},
  title     = {Park's Lemma},
}
\end{filecontents}

\GetTitleStringSetup{expand=true}
\newcommand\gobbletext[1]{#1}
\GetTitleStringDisableCommands{\def\gobbletext#1{}}

\begin{document}
    \begin{lemma}[Park's Lemma\gobbletext{~\textnormal{\cite{park}}}]\label{lemma:parks-lemma}
        This is Park's Lemma
    \end{lemma}
    
    Check out \nameref{lemma:parks-lemma}!
    
    \bibliographystyle{plain}
    \bibliography{references}
\end{document}

在此处输入图片描述

如果只有引用是问题,你也可以使用更简单的

\GetTitleStringSetup{expand=true}
\GetTitleStringDisableCommands{\def\cite#1{}}

但是不要使用,~因为空间将会保留。

答案2

你可以尝试一下:

\documentclass[12pt]{article}
\usepackage{hyperref}
\usepackage[capitalize,nameinlink]{cleveref}
\usepackage{amsthm}
\usepackage{nameref}
\theoremstyle{definition}
\newtheorem{definition}{Definition}[section]
\theoremstyle{plain}
\newtheorem{theorem}[definition]{Theorem}
\newtheorem{lemma}[definition]{Lemma}

\begin{filecontents}{references.bib}
@techreport{park,
  author    = {Park},
  title     = {Park's Lemma},
}
\end{filecontents}

\NewDocumentCommand\lemmacite{om}{%
  \unskip~\textnormal{\IfValueTF{#1}{\cite[#1]{#2}}{\cite{#2}}}%
}

\newcommand*{\lemmaref}[1]{%
  {\RenewDocumentCommand\lemmacite{om}{\unskip}\nameref{#1}}%
}

\begin{document}
    \begin{lemma}[Park's Lemma \lemmacite{park}]\label{lemma:parks-lemma}
        This is Park's Lemma
    \end{lemma}
    
    Check out \lemmaref{lemma:parks-lemma}!
    
    \bibliographystyle{plain}
    \bibliography{references}
\end{document}

\lemmaref命令中\lemmacite,本地重新定义为不产生输出,但甚至删除最后的跳过。

我知道,目前它不是完全自动化的,因为你必须使用\lemmaciteand\lemmaref而不是\citeand \nameref。然而,也许它可以成为完全自动化解决方案的第一步。

相关内容