amsrefs \bibselect 有时会关心 .ltb 文件中的命令

amsrefs \bibselect 有时会关心 .ltb 文件中的命令

根据 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

相关内容