这个问题询问如何将代码保存在 bbl 文件中。幸运的是,无需修改 bbl 文件即可找到并解决根本原因。几个答案指出不应更改 bbl 文件,并且(通常)有更好的方法来实现目标。
但是,有些情况下,修改 bbl 文件是唯一的选择。在这种情况下,我需要使用 ACM sig-alternate LaTeX 类来平衡文章最后一页的列。sig-alternate 样式的作者建议的“官方”解决方案是修改 bbl 文件并将命令插入到\balancecolumns
应该出现列分隔符的位置。当然,我想避免直接修改它,而是找到一种可维护的方法来获取列分隔符。
我发现的所有解决方案都不适合我的情况(我知道它们在某些情况下有效,但我现在有一篇论文,它们不起作用)。我尝试过这个balance
包,这个flushend
包,试验过这个multicol
包,摆弄过页面高度,......
此时,最可维护的解决方案似乎确实是以某种方式将 ACM sig-alternate class 命令\balancecolumns
自动放入 bbl 文件中。我可以通过编辑 BibTeX 文件或 LaTeX 文件来实现这一点吗?如果我必须自己指定中断发生的位置,那就没问题,但我不想修改临时文件(例如 bbl 文件)。我是否必须求助于使用 sed 或其他程序以编程方式编辑文件?
答案1
.bbl
一般情况下,可以使用以下方法将材料添加到文件中
@premble{ <command to be inserted in the bbl> }
但是,@preamble
在 的开头添加了.bbl
。
在 中的特定点添加一些命令的一种策略bbl
是创建一个钩子(使用toolbox
\patchcmd
),\bibitem
其中由特定的 激活key
。这是一种可行的方法。
\patchcmd{\@bibitem}
{\item}
{\ifstrequal{#1}{KEY}{\balance}{}\item}
{}
{}
\patchcmd{\@lbibitem}
{\item}
{\ifstrequal{#1}{KEY}{\balance}{}\item}
{}
{}
\makeatother
上面的代码本质上是\balancecolumns
在引用之前添加 key KEY
。请注意,在普通 latex 中\bibitem
会扩展为\@lbibitem
或\@bibitem
,因此我们必须修补这两个命令。
以下是完整的 MWE
\documentclass[twocolumn]{article}
\usepackage{etoolbox}
\usepackage{balance}
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@article{first,
author = "A.U. Thor",
title = "Atitle",
journal = "AJournal",
year = 2013,
pages = {1-10}
}
@article{second,
author = "A.U. Thor",
title = "Btitle",
journal = "AJournal",
year = 2013,
pages = {11}
}
@article{third,
author = "A.U. Thor",
title = "Ctitle",
journal = "AJournal",
year = 2013,
pages = {12-}
}
@article{fourth,
author = "A.U. Thor",
title = "Dtitle",
journal = "AJournal",
year = 2013,
}
\end{filecontents}
\makeatletter
\patchcmd{\@bibitem}
{\item}
{\ifstrequal{#1}{third}{\balance}{}\item}
{}
{}
\patchcmd{\@lbibitem}
{\item}
{\ifstrequal{#1}{second}{\balance}{}\item}
{}
{}
\makeatother
\begin{document}
\nocite{*}
\bibliographystyle{plain}
\bibliography{\jobname}
\end{document}
输出结果