下面的代码没有完成它应该做的事情:
\documentclass{article}
\usepackage{refcheck}
\begin{document}
\begin{thebibliography}{1111}
%% This works:
\bibitem[Ccc]{FP}
The Frog, Kermit, and Piggy, Miss.
\newblock Sesame Street.
%% This does not work:
\bibitem[CCC]{FP2}
The Frog, Kermit, and Piggy, Miss.
\newblock Sesame Street.
\end{thebibliography}
\end{document}
我收到以下错误:
! Undefined control sequence.
\\bibitem ...$}}\@@@biblabel@@ }\fi }\ifx #1\@nil
\@@bibitem@@ {#2}\else \@@...
l.14 \bibitem[CCC]{FP2}
似乎refcheck
中的某些可选标签有问题\bibitem
。
我在这里做错了什么?
答案1
更新
此问题已在 1.9.1 版refcheck.sty
(2013 年 2 月 14 日)中得到解决
refcheck
原始答案(对于1.9 版仍然有效)
中存在严重错误。重新定义的refcheck
方法如下:refcheck.sty
\bibitem
\renewcommand{\bibitem}[2][\@nil]{%
\@ifundefined{cit@#2}{%
\@warning@rc@{Unused bibitem `#2' on page \thepage}%
\if@show@cite
\gdef\@biblabel{\makebox[0pt][r]{\zero@height{{\mark@size{\bfseries\upshape?}}%
\underline{\@verbatim@{#2}}{\mark@size{\bfseries\upshape?}}$\,$}}%
\@@@biblabel@@
}%
\fi
}{%
\if@show@cite
\set@fbox@par
\gdef\@biblabel{\makebox[0pt][r]{\zero@height{\fbox{\@verbatim@{#2}}$\,$}}\@@@biblabel@@}%
\fi
}%
\ifx#1\@nil\@@bibitem@@{#2}%
\else\@@bibitem@@[#1]{#2}%
\fi
}%
问题出在最后部分:任何可选参数中前两个字母相等的条目都会触发错误。让我们看看为什么。代码如下
\ifx#1\@nil\@@bibitem@@{#2}%
\else\@@bibitem@@[#1]{#2}%
\fi
当你有
\bibitem[Ccc]{FP}
论点#1
是Ccc
;因此条件
\ifx Ccc\@nil
为 false,则\else
跳过之前的所有内容。在
\bibitem[CCC]{FP2}
TeX 发现
\ifx CCC\@nil
条件是真的,所以\@nil
应该扩展,但由于 LaTeX 内核故意没有定义它,所以无法扩展。
这个包想要做什么?它想要检查是否未指定可选参数,这是错误的这样做。这里有一个更好的版本:
\usepackage{refcheck}
\makeatletter
\AtBeginDocument{
\renewcommand{\bibitem}[2][]{%
\@ifundefined{cit@#2}{%
\@warning@rc@{Unused bibitem `#2' on page \thepage}%
\if@show@cite
\gdef\@biblabel{\makebox[0pt][r]{\zero@height{{\mark@size{\bfseries\upshape?}}%
\underline{\@verbatim@{#2}}{\mark@size{\bfseries\upshape?}}$\,$}}%
\@@@biblabel@@
}%
\fi
}{%
\if@show@cite
\set@fbox@par
\gdef\@biblabel{\makebox[0pt][r]{\zero@height{\fbox{\@verbatim@{#2}}$\,$}}\@@@biblabel@@}%
\fi
}%
\if\relax\detokenize{#1}\relax\@@bibitem@@{#2}%
\else\@@bibitem@@[#1]{#2}%
\fi
}
}% End of \AtBeginDocument
\makeatother
非 e-TeX 方式可能是
\ifx\valign#1\valign
而不是更好的
\if\relax\detokenize{#1}\relax
随意选择。