是否可以为 的键设置别名/同义词amsrefs
?请考虑以下示例文档:
\documentclass{amsart}
\usepackage{amsrefs}
\begin{document}
See \cite{short}.
It is the same reference as
%\cite{a-longer-label-for-the-texbook}
%% Uncomment the previous line.
\cite{short}. %% Comment out this line
\begin{bibdiv}
\begin{biblist}
\bib{short}{book}{
author={Knuth, Donald},
title={The TeXbook}
}
%\synonym{a-longer-label-for-the-texbook}{short}
%% Uncomment the previous line.
\end{biblist}
\end{bibdiv}
\end{document}
我想取消注释指示的两行(并注释掉指示的行)并具有相同的行为。(当然,我可以复制较长键下参考书目条目的内容short
;但是,如果我在源中使用这两个标签,那么生成的参考书目中就会出现两个相同的条目。)
如果我们谈论的是\label
s 而不是参考书目条目,那么可以 — — 虽然我知道这不是最佳实践 — — 只需将两个\label
s 放在相关范围内,并交替引用它们;这就是我所寻求的功能。文档提及“别名”这个词(但不是“同义词”这个词),但在这种情况下不是。
这似乎是一个非常奇怪的愿望。人们可能想这样做有几个原因;我给出两个我自己想到的原因,尽管我承认它们不一定令人信服。一个是允许与不同意内部参考书目键格式的合著者轻松编写文档,同时让每个人都满意。当然,这可能会使 TeX 代码令人困惑,所以这里还有另一个原因。
出于第二个原因,我之前的是合著者:我希望能够使用一个amsrefs
文件来保存我的所有论文,同时也能够适应我随着时间的推移在选择密钥方面所做的更改,而不必更改旧论文的来源。在这里我可以只需复制参考书目条目,只要我在每个文档中引用它的方式一致即可;但这样很容易混淆几乎- 重复条目(例如,一本书的第一版和第二版)实际上-重复条目。\synonym
类型会使故意重复变得明确。
答案1
的内部引用short
存储在 中\b@short
。我们可以利用.aux
文件 使新密钥与 相同\b@short
。使用\csname
和\endcsname
,因为密钥可能不只包含字母。
\documentclass{amsart}
\usepackage{amsrefs}
\makeatletter
\newcommand{\makesynonym}[2]{%
\AtEndDocument{\write\@auxout{\noexpand\@makesynonym{#1}{#2}}}%
}
\newcommand{\@makesynonym}[2]{%
\global\expandafter\let\csname b@#1\expandafter\endcsname\csname b@#2\endcsname
}
\makeatother
\makesynonym{a-longer-label-for-the-texbook}{short}
\begin{document}
See \cite{short}.
It is the same reference as
\cite{a-longer-label-for-the-texbook}
\begin{bibdiv}
\begin{biblist}
\bib{short}{book}{
author={Knuth, Donald},
title={The TeXbook}
}
\end{biblist}
\end{bibdiv}
\end{document}