我的文档中有空引用\cite{}
。我期望收到一些警告。
这是一个错误吗?(如果不是 - 为什么?)是否可以启用对此类情况的检查?
梅威瑟:
\documentclass{article}
\begin{document}
\cite{Goodfellow2014a}
\cite{}
\bibliography{main}
\bibliographystyle{plain}
\end{document}
和main.bib:
@misc{Goodfellow2014a,
author = {Goodfellow, I J and Shlens, J and Szegedy, C},
title = {{Explaining and harnessing adversarial examples}},
year = {2014}
}
我正在使用 pdflatex 和 bibtex。
答案1
我们无法改变\@for
,但考虑到它看起来像是错误的行为,也许我们可以通过在调用之前检查空参数来修复它\@citex
(我们无法在那个宏中执行此操作,因为太多样式重新定义了它)。
例如
\documentclass{article}
\makeatletter
\DeclareRobustCommand\cite{%
\@ifnextchar [{\@tempswatrue\@citexfix}{\@tempswafalse\@citexfix[]}}
\def\@citexfix[#1]#2{%
\IfBlankTF {#2}%
{\@citex[#1]{\space}}%
{\@citex[#1]{#2}}%
}
\ExplSyntaxOn
\cs_new_eq:NN \IfBlankTF \tl_if_blank:nTF
\ExplSyntaxOff
\makeatother
\begin{document}
\cite{Goodfellow2014a}
\cite{}
\cite{ }
\cite{ } %tab
\bibliography{main}
\bibliographystyle{plain}
\end{document}
答案2
嗯,\cite
采用逗号分隔的引用键列表,如果您使用,\cite{aaa,bbb,}
那么您会收到有关尾随逗号的空条目的警告,但如果列表完全为空,则会跳过整个内容。
这实际上是 LaTeX\@for
循环宏的一个功能:
\documentclass{article}
\makeatletter
\begin{document}
\@for \tmp:=aa,bb,\do{\typeout{1 [\tmp]}}
\@for \tmp:=\do{\typeout{2 [\tmp]}}
\end{document}
产生终端和日志输出
1 [aa]
1 [bb]
1 []
其中第一个循环包含一个具有空值的迭代,但第二个循环根本没有迭代。
这可能有点出乎意料,但\@for
自从最早的乳胶版本发布以来一直如此,所以到现在已有近 40 年了,它被用在乳胶格式和包装中的多个地方。
\@for
记录为接受(并暗示跳过)长度为 0 的列表
% \@for NAME := LIST \do {BODY} : Assumes that LIST expands to A1,A2,
% ... ,An .
% Executes BODY n times, with NAME = Ai on the i-th iteration.
% Optimized for the normal case of n = 1. Works for n=0.
因此可以说,意外的行为是结尾的逗号没有被忽略。