背景
现在 TeX Live 2010 已经受到限制\write18
,我认为更新我的简历是合理的,它使用该bibunits
包对每个文件运行 BibTeX .aux
。
目前,我有一个宏\pubs
,可以排版标签,然后排版参考书目(在环境\pubs
中使用,但在这里并不重要)。cvlist
currvita
\makeatletter
\newcommand*\pubs[2]{%
\item[#1]
\begin{bibunit}%
\nocite{#2}%
\putbib
\end{bibunit}%
\IfFileExists{\@bibunitname.bbl}{}
{Run \texttt{bibtex \@bibunitname}}%
}
\makeatother
它的用途类似于\pubs{Refereed papers}{foo,bar,baz}
排版与引用键 foo、bar 和 baz 相对应的参考书目条目(或者如果尚未运行 BibTeX,它会打印一条有用的消息)。
问题
我该如何修改它bibtex \@bibunitname
以合理的方式运行并使用结果?
我有一个最有效的想法
\makeatletter
\newcommand*\pubs[2]{%
\item[#1]
\begin{bibunit}%
\nocite{#2}%
\immediate\write\@bibunitaux{\string\bibdata{\bu@bibdata}}%
\end{bibunit}%
\immediate\write18{bibtex \@bibunitname}%
\InputIfFileExists{\@bibunitname.bbl}{}
{Run \texttt{bibtex \@bibunitname}}%
}
\makeatother
此处,\putbib
已被 取代,\bibdata
并\IfFileExists
变为\InputIfFileExists
。运行时,它会抱怨我的所有引用都未定义,但输出看起来不错。特别是,所有 aux 文件在从 读取之前都会被关闭\InputIfFileExists
。
答案1
在我写下这个答案之后,我意识到这并不是你想要做的。哦,不用研究bibunits
,我的猜测是你需要等到辅助文件关闭后才能运行bibtex
。以下是针对主文档类执行此操作的技巧:
\documentclass{article}
\makeatletter
\let\end@doc@hook\@enddocumenthook
\def\@enddocumenthook#1\@@end{
\end@doc@hook
#1
\immediate\write18{echo "^^J^^JCompiling bibliography with BibTeX:^^J" && bibtex \jobname && echo "^^JEnd BibTeX processing^^J"}
\@@end
}
\makeatother
\begin{document}
\cite{whole-set}
\bibliographystyle{plain}
\bibliography{xampl}
\end{document}