我为许多类似风格的文档(几十个)编写了一个通用的中心序言,大多数文档在开头都有一个参考书目,所以我称之为
\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}
检查取消注释引文。