如何保护 amsrefs 的 \bib* 字段内的脆弱命令或一般命令?

如何保护 amsrefs 的 \bib* 字段内的脆弱命令或一般命令?

我想请教一下如何保护\bib*包中不可引用的书目字段中的命令(我通常认为这些命令是脆弱的) amsrefs

考虑以下 MWE1,摘自文档该软件包的文档amsrefs(2013 年 1 月 16 日版本):

%MWE1
\documentclass{article}
\usepackage{amsrefs}

\begin{document}

\cite{Burkholder1986a}

\begin{bibdiv}
\begin{biblist}

\bib{Burkholder1986a}{article}{
    author={Burkholder, Donald L.},
    title={Martingales and Fourier analysis in Banach spaces},
    conference={
        title={C.I.M.E. Lectures},
        address={Varenna, Italy},
        date={1985}
    },
    book={
        series={Lecture Notes in Math.},
        volume={1206},
        publisher={Springer-Verlag},
        address={Berlin and New York},
        date={1986},
    },
    pages={61--108},
    review={\MR{0864712}}
}

\end{biblist}
\end{bibdiv}

\end{document}

在 MWE1 中,我们仅使用\bib,并且没有\bib*命令。MWE1 编译正确。

现在,考虑以下 MWE2,我们对 MWE1 进行了一点修改,并尝试将书籍/期刊信息与文章信息分开(xref这次我们将使用字段):

%MWE2
\documentclass{article}
\usepackage{amsrefs}

\begin{document}

\cite{Burkholder1986a-citable-whole-journal}

\cite{Burkholder1986a-citable-article-example}

\begin{bibdiv}
\begin{biblist}

\bib*{Burkholder1986a-not-citable}{article}{
    conference={
        title={C.I.M.E. Lectures},
        address={Varenna, Italy},
        date={1985}
    },
    book={
        series={Lecture Notes in Math.},
        volume={1206},
        publisher={Springer-Verlag},
        address={Berlin and New York},
        date={1986},
    },
}
    
\bib{Burkholder1986a-citable-whole-journal}{article}{
    xref={Burkholder1986a-not-citable},
}
    
\bib{Burkholder1986a-citable-article-example}{article}{
    xref={Burkholder1986a-not-citable},
    author={Burkholder, Donald L.},
    title={Martingales and Fourier analysis in Banach spaces},
    pages={61--108},
    review={\MR{0864712}}
}

\end{biblist}
\end{bibdiv}

\end{document}

在 MWE2 中,我们用于\bib*保存不可引用的书籍/期刊信息,以及\bib保存可引用的信息。我们可以使用\bib*这种方式,这样就不必重复信息:常见的书籍/期刊信息放在一个容器中,单独的/个别的文章信息放在其他容器中。

例如,要引用整个期刊,我们可以使用\cite{Burkholder1986a-citable-whole-journal}。要引用特定文章(如上面给出的文章),我们可以使用\cite{Burkholder1986a-citable-article-example}。所有这些想法都基于我在语言

此外,根据语言\bib*MWE2 中的字段被视为移动参数,因此,所有脆弱的命令都必须受到保护。但是,在这个例子中,MWE2 中的字段中没有“命令” \bib*(它们只是文本、字符串),因此目前是安全的。

然而,我们还在 MWE2 中观察到,字段中有一个命令\bib\MR评论字段内的命令。我在这里假设(只是为了讨论)数学评论编号{0864712}指的是特定文章,而不是整个期刊。

MWE2 可以正确编译,就像 MWE1 一样。

现在,考虑 MWE3,我们在 MWE2 中进一步做了一些临时的“修改”,以便命令会出现在字段中\bib*,只是为了试水,可以这么说:

%MWE3
\documentclass{article}
\usepackage{amsrefs}

\begin{document}

\cite{Burkholder1986a-citable-whole-journal}

\cite{Burkholder1986a-citable-article-example}

\begin{bibdiv}
\begin{biblist}

\bib*{Burkholder1986a-not-citable}{article}{
    conference={
        title={C.I.M.E. \protect\MakeUppercase{L}ectures},
        address={Varenna, Italy},
        date={1985}
    },
    book={
        series={Lecture Notes in Math.},
        volume={1206},
        publisher={Springer-Verlag},
        address={Berlin and New York},
        date={1986},
    },
    review={\protect\MR{0864712}}
    }
    
\bib{Burkholder1986a-citable-whole-journal}{article}{
    xref={Burkholder1986a-not-citable},
    }
    
\bib{Burkholder1986a-citable-article-example}{article}{
    xref={Burkholder1986a-not-citable},
    author={Burkholder, Donald L.},
    title={Martingales and Fourier analysis in Banach spaces},
    pages={61--108},
    }

\end{biblist}
\end{bibdiv}

\end{document}

在 MWE3 中,\MakeUppercase命令出现在会议复合字段内的标题字段中。例如,如果我想确保Lectures始终大写。同样在 MWE3 中,我们目前假设《数学评论》编号指的是整个期刊,而不是文章。因此,命令\MR位于 内\bib*。因此,通过这些临时更改,我们可以看到现在字段内有命令\bib*

它说语言字段\bib*被视为移动参数,因此,必须保护易碎命令。我将其理解为放在\protect命令\MakeUppercase和之前\MR(我假设它们是易碎的)。这就是为什么\protect在 MWE3 中显示的原因。

MWE3 无法正确编译。如果我删除\protectMWE3 中的命令,MWE3 仍然无法编译。我假设 MWE3 无法正确编译是因为我没有正确保护命令\MakeUppercase\MR。如果我想在里面的字段中包含命令\bib*,就像 MWE3 中的示例一样,我该如何保护它们?

我认为这个顾虑非常重要,因为我想将常见的整本书/整本期刊信息与个别文章信息区分开来。使用amsrefs,似乎唯一的方法是使用\bib*

答案1

我看不出有任何需要\MakeUppercase{L},因为没有应用大小写更改:否则你也必须对 CIME 这样做

真实的问题在于\MR,有或没有\protect都会导致无限循环。

解决方法: 做到\protected

\documentclass{article}
\usepackage{amsrefs,etoolbox}

\robustify\MR

\begin{document}

\cite{Burkholder1986a-citable-whole-journal}

\cite{Burkholder1986a-citable-article-example}

\begin{bibdiv}
\begin{biblist}
\bib*{Burkholder1986a-not-citable}{article}{
  conference={
    title={C.I.M.E. Lectures},
    address={Varenna, Italy},
    date={1985}
  },
  book={
    series={Lecture Notes in Math.},
    volume={1206},
    publisher={Springer-Verlag},
    address={Berlin and New York},
    date={1986},
  },
  review={\MR{0864712}}
}

\bib{Burkholder1986a-citable-whole-journal}{article}{
  xref={Burkholder1986a-not-citable},
}

\bib{Burkholder1986a-citable-article-example}{article}{
  xref={Burkholder1986a-not-citable},
  author={Burkholder, Donald L.},
  title={Martingales and Fourier analysis in Banach spaces},
  pages={61--108},
}
\end{biblist}
\end{bibdiv}

\end{document}

这似乎是一个错误amsrefs(我不推荐它,因为biblatex它功能更强大并且维护得更好)。

在此处输入图片描述

答案2

\MakeUppercase已经是 latex 健壮的,但 amsrefs 似乎在错误的时间对其进行了扩展。不清楚你为什么要这样做,但如果出于某种原因确实需要它,\MakeUppercase{L}你可以在这里使用 etex 。\protected

\documentclass{article}
\usepackage{amsrefs}
\protected\def\zzz{\MakeUppercase}
\begin{document}
\cite{Burkholder1986a-citable-whole-journal}
\cite{Burkholder1986a-citable-article-example}
\begin{bibdiv}
\begin{biblist}
\bib*{Burkholder1986a-not-citable}{article}{
conference={
title={C.I.M.E. \zzz{L}ectures},
address={Varenna, Italy},
date={1985}
},
book={
series={Lecture Notes in Math.},
volume={1206},
publisher={Springer-Verlag},
address={Berlin and New York},
date={1986},
},
review={MR{0864712}}
}

\bib{Burkholder1986a-citable-whole-journal}{article}{
xref={Burkholder1986a-not-citable},
}

\bib{Burkholder1986a-citable-article-example}{article}{
xref={Burkholder1986a-not-citable},
author={Burkholder, Donald L.},
title={Martingales and Fourier analysis in Banach spaces},
pages={61--108},
}
\end{biblist}
\end{bibdiv}
\end{document}

相关内容