根据 amsrdoc.pdf,
当 amsrefs 将 nonsense.ltb 作为数据库文件处理时,它会忽略除
\bib
命令之外的所有内容。
然而,在本例中情况并非如此:
测试1.tex
\documentclass{amsart}
\usepackage{hyperref}
\usepackage[lite]{amsrefs}
\usepackage{amsmath,amssymb,latexsym}
\begin{document}
\title{Xyz}
\author{Dale R. Worley}
\email{[email protected]}
\date{\today}
\maketitle
\section{References}
\begin{biblist}[\normalsize]*{labels={alphabetic}}
\bibselect{test2}
\end{biblist}
\end{document}
测试2.ltb
\documentclass{amsart}
\usepackage{hyperref}
\usepackage[lite]{amsrefs}
\usepackage{amssymb}
\newcommand{\foobar}{foobar}
\begin{document}
\title{Abc}
\author{Dale R. Worley}
\email{[email protected]}
\date{\today}
\maketitle
\section{Annotated bibliography}
\begin{biblist}[\normalsize]*{labels={alphabetic}}
\bib{Ber1986}{article}{
label = {Ber1986},
author = {Berele, Allan},
title = {A Schensted-type correspondence for the symplectic group},
journal = {J. Combin. Theory},
volume = {Ser. A 43},
date = {1986},
pages = {320--328},
%review = {\MR{***}},
doi = {10.1016/0097-3165(86)90070-1},
eprint = {https://www.sciencedirect.com/science/article/pii/0097316586900701},
note = {https://scholar.google.com/scholar?cluster=11001899118143708236},
}
\bigskip
\foobar. Topics: ***
\bigskip
\end{biblist}
\end{document}
在这种情况下,LaTex 会反对\foobar
未定义的控制序列。但是,如果我在 前面加上“%”、“xxx”或“\null” \foobar
,LaTeX 不会产生任何错误消息。
这里发生了什么?我怎样才能让 amsrefs 按照文档所述的方式运行?
答案1
根本问题是,当 \bibselect 处理 .ltb 文件时,它不仅检查每一行是否以 \bib 开头,还会扩展行上的初始标记以查看扩展是否以 \bib 开头。这样做的好处是 \bibselect 会注意到使用生成 \bib 的宏创建的参考书目条目。缺点是,如果 .tex 文件未定义在 .ltb 中作为行的第一个标记出现的宏,它就会阻塞。
修复方法是向 \ReadBibLoop@a 添加额外的 \ifdefined 检查,如下所示:
% Do not expand the token at the beginning of a line of the .ltb file
% to check if it expands into \bib if it is not defined.
\makeatletter
\long\def\ReadBibLoop@a#1#2\@nil{%
\ifx\bib#1%
\CurLine % just exec it
\else
\ifx\endinput#1%
\let\ReadBibLoop\@empty
\else
\ifdefined#1
\@xp\ReadBibLoop@b#1#2\@empty\@nil
\fi
\fi
\fi
}
\makeatother