BibTeX:如何强制@PREAMBLE 断行?

BibTeX:如何强制@PREAMBLE 断行?

我想通过特殊的 BibTeX 声明将一系列 LaTeX 命令写入 bbl 辅助程序@PREAMBLE,并且我想在需要的地方断行。有什么技巧可以做到这一点吗?

例如以下 BibTeX 代码

@PREAMBLE{"\makeatletter"}
@PREAMBLE{"\providecommand\dosomething[0]{}"}
@PREAMBLE{"\makeatother"}

.bbl将在输出中添加以下前言

\makeatletter\providecommand\dosomething[0]{}\makeatother

我希望看到类似的东西

\makeatletter
\providecommand\dosomething[0]{}
\makeatother

对于较长的代码,行会被任意折断。我想控制折断。

答案1

BibTeX 来源bibtex.web(链接至 CTAN也可以在 GitHub 镜像上找到)@preamble对(有一些评论ll. 5498-5590

@:database-file commands}{\quad \.{preamble}@>
The \.{preamble} command lets a user have \TeX\ stuff inserted (by the
standard styles, at least) directly into the \.{.bbl} file.  It is
intended primarily for allowing \TeX\ macro definitions used within
the bibliography entries (for better sorting, for example).  One
\.{preamble} command per \.{.bib} file should suffice.

A \.{preamble} command has either braces or parentheses as outer
delimiters.  Inside is the preamble string, which has the same syntax
as a field value: a nonempty list of field tokens separated by
|concat_char|s.  There are three types of field tokens---nonnegative
numbers, macro names, and delimited strings.

请注意,BibTeX 要求@preamble每个.bib文件只有一个指令(平均而言)。也就是说,它允许您拥有@preamble与最大文件数一样多的指令.bib。事实上,后来我们发现(8043-8044

The |s_preamble| array is big enough to allow an average of one
\.{preamble\$} command per \.{.bib} file.

负责处理前导指令并在 BibTeX 编程语言中公开的函数,如preamble$记录为(10555-10571

@
The |built_in| function {\.{preamble\$}} pushes onto the stack the
concatenation of all the \.{preamble} strings read from the database
files.

@<|execute_fn|({\.{preamble\$}})@>=
procedure x_preamble;
begin
ex_buf_length := 0;
preamble_ptr := 0;
while (preamble_ptr < num_preamble_strings) do
    begin
    add_buf_pool (s_preamble[preamble_ptr]);
    incr(preamble_ptr);
    end;
add_pool_buf_and_push;          {push the concatenation string onto the stack}
end;

这意味着 BibTeX 只会将给出的字符串连接成@preamble一个可以放入 BibTeX 堆栈的长字符串。它不会在中间添加任何内容,也没有简单的方法可以再次分解字符串。

由于 BibTeX 读取@preamble内容的方式与读取普通字段内容一样,因此换行符会被转换为空格,这样

@PREAMBLE{"
\makeatletter
\providecommand\dosomething[0]{}
\makeatother
"}

仍然是

 \makeatletter \providecommand\dosomething[0]{} \makeatother

我担心,如果没有大量额外的工作(不确定是否可行,但想法是手动添加某种行尾标记并在 BibTeX 中的这个标记处拆分字符串)或修改 BibTeX 源并重新编译,就无法在生成的字符串中获取换行符@preamble

您是否有任何理由想要控制换行符?我原以为,由于该.bbl文件是辅助文件,因此很少有人愿意直接使用它。但我也认为,人们不想添加那么多长@preamble指令,以至于换行符变得很重要。

如果您编写自己的.bst文件,则可以对 进行硬编码,.bbl该代码由 自动添加.bst(而不是@preamble来自.bib文件)。使用这种方法,您可以随意插入换行符。

相关内容