![从 nameref 中删除引用](https://linux22.com/image/457704/%E4%BB%8E%20nameref%20%E4%B8%AD%E5%88%A0%E9%99%A4%E5%BC%95%E7%94%A8.png)
我有一些定理/引理,它们的名称中有引用,如下所示:
\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
,本地重新定义为不产生输出,但甚至删除最后的跳过。
我知道,目前它不是完全自动化的,因为你必须使用\lemmacite
and\lemmaref
而不是\cite
and \nameref
。然而,也许它可以成为完全自动化解决方案的第一步。