![问题](https://linux22.com/image/297331/%E9%97%AE%E9%A2%98.png)
我想在命令中存储 bib 文件路径的一部分。但是如果我运行此示例(无需 bib 文件或 bib 条目即可查看问题),路径中会出现不需要的空格:
\documentclass[]{scrartcl}
\usepackage{biblatex}
\newcommand\pathtosrc{test/}
\addbibresource{\pathtosrc contact.bib}
%\edef\bibpath{\pathtosrc contact.bib}
%\addbibresource{\bibpath}
\begin{document}
\cite{a}
\end{document}
biber 给出错误信息,表明路径中的 test/ 后面有一个空格:
ERROR - Cannot find 'test/ contact.bib'
问题
这是一个错误还是一个功能?
如何才能抑制变体之间的空间差异
\edef
?
答案1
\addbibresource
做\begingroup\blx@hook@fileverb
什么
\let\do\@makeother\dospecials\catcode`\\=\z@\catcode`\{=\@ne\catcode`\}=\tw@
在抓取真实参数之前,结果是参数中的空格被类别代码 12 吸收,因此它们在控制序列之后不会被忽略。
我想说尝试一下
\appto\blx@hook@fileverb{\catcode`\ =10 }
但是当名称包含空格时,我不知道文件名解释会产生什么后果。
完整示例:
\documentclass[]{scrartcl}
\usepackage{biblatex}
\makeatletter
\appto\blx@hook@fileverb{\catcode`\ =10 }
\makeatother
\newcommand\pathtosrc{Tesi classica/}
\addbibresource{\pathtosrc Bibliografia.bib}
\begin{document}
\cite{a}
\end{document}
我的工作目录中有一个Tesi classica
目录。这是运行 Biber 时的终端输出:
INFO - This is Biber 1.9
INFO - Logfile is 'addbibspace.blg'
INFO - Reading 'addbibspace.bcf'
INFO - Found 1 citekeys in bib section 0
INFO - Processing section 0
INFO - Looking for bibtex format file 'Tesi classica/Bibliografia.bib' for section 0
INFO - Decoding LaTeX character macros into UTF-8
INFO - Found BibTeX data source 'Tesi classica/Bibliografia.bib'
WARN - I didn't find a database entry for 'a' (section 0)
INFO - Overriding locale 'en-US' defaults 'normalization = NFD' with 'normalization = prenormalized'
INFO - Overriding locale 'en-US' defaults 'variable = shifted' with 'variable = non-ignorable'
INFO - Sorting list 'nty' of type 'entry' with scheme 'nty' and locale 'en-US'
INFO - No sort tailoring available for locale 'en-US'
INFO - Writing 'addbibspace.bbl' with encoding 'ascii'
INFO - Output to addbibspace.bbl
INFO - WARNINGS: 1
因此建议的路径似乎有效。
如果没有补丁,以下策略
\makeatletter
\newcommand{\definebiberpath}[2]{%
\newcommand{#1}{#2\@gobble}%
}
\makeatother
\definebiberpath{\pathtosrc}{Tesi classica/}
将工作。