如何在 BibTeX 中使用 \write18

如何在 BibTeX 中使用 \write18

背景
现在 TeX Live 2010 已经受到限制\write18,我认为更新我的简历是合理的,它使用该bibunits包对每个文件运行 BibTeX .aux

目前,我有一个宏\pubs,可以排版标签,然后排版参考书目(在环境\pubs中使用,但在这里并不重要)。cvlistcurrvita

\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}

答案2

作为PerlTeX,我在另一个帖子上发布了一则短文邮政我要厚颜无耻地在这里引用一段话:

我知道这不是问题的答案,但也许可以帮助您解决问题。 PerlTeX 允许您将 Perl 代码嵌入为 LaTeX 函数。 编译时,如果您使用, perltex --nosafe myfile.tex则 perl 进程可以自由调用系统函数。 我不确定这是否可以帮助您解决问题(由于操作顺序,但如果 \write18 在编译时可以工作,那么这应该可以),但这是一种完全访问系统的方法,以及在源代码中使用内联 Perl 代码的其他好处。

相关内容