我想通过特殊的 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
文件)。使用这种方法,您可以随意插入换行符。