以下示例运行良好。但是,如果\bibliographystle{plainnat}
替换为\bibliographystle{te}
,te.bst
样式在哪里可用http://econtheory.org/technical/te.bst,则会产生两个错误:“未定义的控制序列。Hotelling, Harold (1929), \enquote ...” 和“未定义的控制序列。...ding, Massachusetts。\bibAnnoteFile ...”。
问题似乎是需要\enquote
和\bibAnnoteFile
来格式化参考文献,但没有及时提供。(bibliographystyle 将它们的定义放在 bbl 文件中。)
有简单的解决办法吗?
\begin{filecontents}{mytestbib.bib}
@article{HotellingEJ1929,
author = {Hotelling, Harold},
title = {Stability in competiton},
journal = {Economic Journal},
year = {1929},
volume = {39},
pages = {41-57}
}
\end{filecontents}
\documentclass{article}
\usepackage{filecontents}
\usepackage{natbib}
\usepackage{bibentry}
\begin{document}
\nobibliography{mytestbib}
A full in-text cite of \bibentry{HotellingEJ1929}.
A regular citation of \cite{HotellingEJ1929}.
\bibliographystyle{plainnat}
\end{document}
答案1
根据我对这个问题的理解(这远非完美),文件中使用的每个宏都bibitems
需要在代码中调用后者时bbl
可用bibentry
。我能够做到这一点的方法是Tex
使用 明确地使它们在文件中全局化\global\def
。
但是,对于\enquote
,情况有所不同,因为命令是bbl
直接在 中定义的,正如您所指出的,这会导致“\enquote 已定义”错误。为了避免此问题,如 @ChristianHupfer 所述,您可以注释掉文件中的以下两行te.bst
:
% write$ newline$
% "\newcommand{\enquote}[1]{``#1''}"
\enquote
并在文档的序言中明确添加的定义Tex
(正如您在之前的评论中所说的那样)。
这是您的 MWE 的修改版本,它在我的系统上运行没有错误(文件中注释了上面列出的两行te.bst
):
\begin{filecontents}{mytestbib.bib}
@article{HotellingEJ1929,
author = {Hotelling, Harold},
title = {Stability in competiton},
journal = {Economic Journal},
year = {1929},
volume = {39},
pages = {41-57}
}
\end{filecontents}
\documentclass{article}
\usepackage{filecontents}
\usepackage{natbib}
\usepackage{bibentry}
\bibliographystyle{te}
\newcommand{\enquote}[1]{``#1''}
\global\def\bibAnnoteFile{}
\begin{document}
\nobibliography*
\noindent A full in-text cite of \bibentry{HotellingEJ1929}.
\bibliography{mytestbib}
\end{document}
其结果是:
答案2
我在使用 BST 文件时也遇到了类似的问题,并发现可以成功将BST 文件中的\newcommand
宏更改为。而不是:\providecommand
write$ newline$
"\newcommand{\enquote}[1]{``#1''}"
尝试:
write$ newline$
"\providecommand{\enquote}[1]{``#1''}"
我无法很好地解释为什么一个有效而另一个无效,但这似乎是一个比破解文件更为强大的解决方法main.tex
。