抑制来自 natbib/multibib 的警告并保持静默

抑制来自 natbib/multibib 的警告并保持静默

我无法抑制警告

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.auxarara

我是不是在逃避什么错误#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

相关内容