我无法抑制警告
Package natbib Warning: Citation `Entry' multiply defined.
使用 natbib 和 multibib 时使用该silence
包。这是我的 MWE:
% arara: pdflatex
% arara: bibtex
% arara: bibtex: {files: [Other]}
% arara: pdflatex
% arara: pdflatex
\documentclass{article}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@article{Entry, Title="Title"}
\end{filecontents}
\usepackage{natbib}
\usepackage{multibib}
\newcites{Other}{Other}
\usepackage{silence}
% does not compile:
%\WarningFilter*{natbib}{Citation `#1
% works, but unwanted:
%\WarningFilter*{natbib}{Citation `}
% does not work:
\WarningFilter*{natbib}{Citation `\#1' multiply defined}
\begin{document}
\let\myjobname\jobname
\cite{Entry}
\citeOther{Entry}
\bibliographystyle{plainnat}
\bibliographystyleOther{plainnat}
\bibliography{\myjobname}
\bibliographyOther{\myjobname}
\end{document}
请注意,如果您不使用,则必须手动bibtex
运行。Other.aux
arara
我是不是在逃避什么错误#1
?
编辑:我应该更具体一点。我想使用带星号的版本,WarningFilter
这样我就可以隐藏不同 bibtex 条目的此消息。我只需要知道如何教如何silence
使用#1
。
答案1
你可以说
\WarningFilter*{natbib}{Citation}
这将抑制所有以“引用”开头的警告;特别是,它将抑制
Citation `#1' multiply defined
来自natbib
。然而,这可能不是你想要的,因为natbib
有其他以字符串“Citation”开头的警告消息;在这种情况下,你可以使用
\WarningFilter{natbib}{Citation `Entry' multiply defined}
相反;请注意未加星号的版本,因此您要瞄准文件中出现的警告消息.log
。
你的例子:
\documentclass{article}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@article{Entry, Title="Title"}
\end{filecontents}
\usepackage{natbib}
\usepackage{multibib}
\newcites{Other}{Other}
\usepackage{silence}
\WarningFilter*{natbib}{Citation}
\begin{document}
\let\myjobname\jobname
\cite{Entry}
\citeOther{Entry}
\bibliographystyle{plainnat}
\bibliographystyleOther{plainnat}
\bibliography{\myjobname}
\bibliographyOther{\myjobname}
\end{document}
答案2
我认为我需要做的事情无法实现。以下是一些证据:
首先,似乎#1
从未被看到过silence
,正如这个 MWE 所示:
% arara: pdflatex
\documentclass{article}
\usepackage{silence}
% works, but too unflexible:
% \WarningFilter{mypackage}{Suppress me}
% does not compile:
% \WarningFilter*{mypackage}{#1}
% this does nothing:
\WarningFilter*{mypackage}{\#1}
% in fact, this at least works for the first one:
\WarningFilter*{mypackage}{\TheWarning}
\begin{document}
\newcommand{\IssueWarning}[1]{\PackageWarning{mypackage}{#1}}
\newcommand{\TheWarning}{Suppress me!}
\IssueWarning{\TheWarning}
\IssueWarning{Suppress me, this may even be more difficult!}
\end{document}
事实上,我原来的 MWE 是有效的:
% works:
\WarningFilter*{natbib}{Citation `Entry' multiply defined}
请注意,这是带星号的版本WarningFilter
!
从silence
文档中,我假设只有一个唯一的星号版本WarningFilter
可以匹配(完整的)给定的警告,所以一定是它。
这是为什么?
natbib
发出如下警告:
\renewcommand\bibcite[2]{\@ifundefined{b@#1\@extra@binfo}\relax
{\NAT@citemultiple
\PackageWarningNoLine{natbib}{Citation `#1' multiply defined}}%
因此,在寻找罪魁祸首调用时\bibcite
,我发现:
\write\@auxout{\string\bibcite{#5}{{#1}{#2}{{#3}}{{#4}}}}}\fi
删除此项后\bibcite
,错误消息确实被删除了,事实上,在两个辅助文件中我通常会发现以下内容:
\bibcite{Entry}{{Ent}{}{{}}{{}}}
因此,\bibcite
发出警告的调用似乎不包含任何可以在\WarningFilter
和之间产生可用差异的内容\WarningFilter*
。
无论如何,我们可以了解到,为了 的目的silence
,#1
需要递归地追踪它,以找到它的最终结果。如果它是纯文本(例如在我的第二个\IssueWarning
示例中),\WarningFilter*
则没有任何优势。
编辑:一个非常简单的补丁natbib
将涉及类似的事情
\newcommand{\HashOne}{#1}
在警戒线之前并由#1
其代替。\HashOne