没有收到空引用警告

没有收到空引用警告

我的文档中有空引用\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.

因此可以说,意外的行为是结尾的逗号没有被忽略。

相关内容