我想请教一下如何保护\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 无法正确编译。如果我删除\protect
MWE3 中的命令,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}