如果没有参考文献,如何避免空的“thebibliography”环境(bibtex)?

如果没有参考文献,如何避免空的“thebibliography”环境(bibtex)?

我为许多类似风格的文档(几十个)编写了一个通用的中心序言,大多数文档在开头都有一个参考书目,所以我称之为

\bibliographystyle{alphadin}
\bibliography{refs}

在中央序言中,以避免大量重复代码,并能够集中更改参考书目样式。但遗憾的是,这些文档中的少数文档有空的参考书目。这些文档向我发出有关空的参考书目环境的警告。但更大的问题是:参考书目标题仍然出现在 pdf 输出中。

有没有办法在有非空参考书目时只获取参考书目标题而不发出警告?正确的计数器或布尔值是什么?或者有一个易于使用的选项?

最小示例:

\documentclass{article}

\begin{document}
  \bibliographystyle{alphadin}
  \bibliography{test}
\end{document}

运行 latex、bibtex、latex、latex。获取 test.bbl

LaTeX Warning: Empty `thebibliography' environment on input line 10.

输入“补丁”并不能解决问题。我想要的是:如果文档中没有 \cite{},则不显示参考书目。

bbl 的内容:

\begin{thebibliography}{}

% this bibliography is generated by alphadin.bst [8.2] from 2005-12-21

\providecommand{\url}[1]{\texttt{#1}}
\expandafter\ifx\csname urlstyle\endcsname\relax
  \providecommand{\doi}[1]{doi: #1}\else
  \providecommand{\doi}{doi: \begingroup \urlstyle{rm}\Url}\fi

\end{thebibliography}

答案1

测试的参数是否thebibliography为空

\documentclass{article}
\let\myBib\thebibliography
\let\endmyBib\endthebibliography

\renewcommand\thebibliography[1]{\ifx\relax#1\relax\else\myBib{#1}\fi}
\begin{document}
foo
  \bibliographystyle{alphadin}
  \bibliography{test}
\end{document}

答案2

thebibliography确实为空的方法环境

该方法可以捕捉以下情况(中间有或没有空行):

\begin{thebibliography}{...}

\end{thebibliography}

环境补丁会在 之后立即thebibliography查找。还支持在 之前添加空行。如果找到 ,则忽略环境。\end\begin{thebibliography}\end\end

\documentclass{article}

\makeatletter
\@ifdefinable{org@thebibliography}{%
  \let\org@thebibliography\thebibliography
  \def\thebibliography#1{%
    \@ifnextchar\par{%
      \par@thebibliography{#1}%
    }{%
      \check@thebibliography{#1}{}%
    }%
  }%
  \newcommand{\par@thebibliography}[2]{%
    \check@thebibliography{#1}{\par}%
  }%
  \newcommand{\check@thebibliography}[2]{%
    \@ifnextchar\end{%
      \let\endthebibliography\relax
    }{%
      \org@thebibliography{#1}#2%
    }%
  }%
}
\makeatother

\begin{document}
  \bibliographystyle{alpha}
  \bibliography{test}
\end{document}

没有警告,没有页面。

(编辑:匹配问题中的例子)。

检查协议文件.blg的方法bibtex

如果没有任何引用,bibtex则会发出错误投诉:

I found no \citation commands---while reading file test.aux

这个错误信息也写在.blg文件中。

补丁会查找该错误消息,如果可以找到错误消息,则会排除参考书目。

\documentclass{article}

\makeatletter
\newif\ifblg@empty
\IfFileExists{\jobname.blg}\@firstofone\@gobble{%
  \RequirePackage{xstring}%
  \begingroup
    \fullexpandarg
    % Method for reading the file is taken from `graphics.sty'.
    \newif\ifblg@read
    \blg@readtrue
    \openin\@inputcheck=\jobname.blg\relax
    \let\do\@makeother
    \dospecials
    \loop
      \read\@inputcheck to\@tempa
      \ifeof\@inputcheck
        \blg@readfalse
      \else
        \IfBeginWith*{\@tempa}
                    {I found no \@backslashchar citation commands}{%
          \global\blg@emptytrue
          \blg@readfalse
        }{}%
      \fi
      \ifblg@read
    \repeat
    \immediate\closein\@inputcheck
  \endgroup
}
\ifblg@empty
  \RequirePackage{version}%
  \excludeversion{thebibliography}%
\fi
\makeatother

\begin{document}
  \bibliographystyle{alphadin}
  \bibliography{test}
\end{document}

基于空论证的方法thebibliography

@egreg 建议检查 的参数thebibliography。如果它为空,则假定书目为空(已更新):

\documentclass{article}
\usepackage{version}
\makeatletter
\@ifdefinable{org@thebibliography}{%
  \let\org@thebibliography\thebibliography
  \def\thebibliography#1{%
    \def\@tempa{#1}%
    \ifx\@tempa\@empty
      \expandafter\@firstoftwo
    \else
      \expandafter\@secondoftwo
    \fi
    {%
      \let\endthebibliography\relax
      \end{thebibliography}%
      \excludeversion{thebibliography}%
      \begin{thebibliography}{}%
    }{%
      \org@thebibliography{#1}%
    }%
  }%
}
\makeatother

\begin{document}
  \bibliographystyle{alphadin}
  \bibliography{test}
\end{document}

答案3

文档中没有引用会导致 BibTeX 写入

\begin{thebibliography}{}

.bbl文件中。因此我们可以检查参数是否为空,因为引用会将最宽的条目放在参数中。

\documentclass{article}

\let\origthebibliography\thebibliography
\let\origendthebibliography\endthebibliography
\newif\ifemptybibliography
\renewenvironment{thebibliography}[1]
 {\if\relax\detokenize{#1}\relax\emptybibliographytrue\else\origthebibliography{#1}\fi}
 {\ifemptybibliography\else\origendthebibliography\fi}


\begin{document}
x%\cite{HH}


  \bibliographystyle{alphadin}
  \bibliography{/usr/local/texlive/2012/texmf-dist/doc/plain/texbytopic/tex}
\end{document}

检查取消注释引文。

相关内容