refcheck 存在问题

refcheck 存在问题

下面的代码没有完成它应该做的事情:

\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}

论点#1Ccc;因此条件

\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

随意选择。

相关内容