![介绍](https://linux22.com/image/334164/%E4%BB%8B%E7%BB%8D.png)
介绍
Mendeley 的桌面软件能够将参考文献导出到 bibtex 兼容文件以用于基于 TeX 的文档。
然而,在导出时,Mendeley 会转义所有特殊字符,特别是下划线字符。在大多数情况下,这是没问题的,但这也会在参考书目条目的“url”字段中完成,并且可能会导致输出错误。相反,这个转义步骤可以禁用,但会导致的问题比它解决的问题多得多。
问题
期望的结果是具有相当于以下内容的超链接:
http://www.example.com/content/news/sep_09/12.html
然而,参考书目使用的 url 值为
http://www.example.com/content/news/sep{\_}09/12.html
这是从外部.bib
文件中检索到的。然后通过\url
(转义所有 HTML 特殊字符)对其进行转义,这样链接现在就是:
http://www.example.com/content/news/sep%7B%5C_%7D09/12.html
我尝试过
我考虑过使用 Biber 来预解析文件,如下图所示这里经过名词复数。我在下面列出了我认为与此等同的内容,因为 MWE 改编自另一个相关替代莫威的回答这里。
正在使用的正则表达式:{\\_}
试过:{\\\_}
,\{\\\_\}
可能的答案
- 我的问题是否只是正则表达式不正确那么简单?
- biber 在读取文件时是否进行了一些解析,因此我不再匹配
{\_}
? - 是否有 biber/biblatex 开关允许 URL 进行 latex 转义而不是逐字转义?
平均能量损失
\RequirePackage{filecontents}
\begin{filecontents*}{\jobname.bib}
@misc{enc2015,
author = {{Example News Company}},
title = {{Daily News for September 9 2015}},
url = {http://www.example.com/content/news/sep{\_}09/12.html},
urldate = {2016-03-08},
year = {2015}
}
\end{filecontents*}
\documentclass{article}
% ---- Bibliography Settings ----
\usepackage{csquotes} % Babel bibliography support package
\usepackage[english]{babel}
\usepackage[backend=biber,style=numeric]{biblatex}
\usepackage{hyperref}
\addbibresource{\jobname.bib}
\DeclareSourcemap{
\maps{
\map{
\step[fieldsource=url,
match=\regexp{\{\textbackslash\textbackslash\textunderscore\}},
replace=\regexp{\textunderscore}]
}
}
}
\begin{document}
\nocite{enc2015}
\printbibliography
\end{document}
脚注
如果 Mendeley 发现此问题,则会提交相关的错误报告/建议Mendeley 论坛:建议 #2088193。
答案1
经过进一步的调查和思考,我找到了一个可行的解决方案。
更新的 MWE
\RequirePackage{filecontents}
\begin{filecontents*}{\jobname.bib}
@misc{enc2015,
author = {{Example News Company}},
title = {{Daily News for September 9 2015}},
url = {http://www.example.com/content/news/sep{\_}09/12},
urldate = {2016-03-08},
year = {2015}
}
\end{filecontents*}
\documentclass{article}
% ---- Bibliography Settings ----
\usepackage{csquotes} % Babel bibliography support package
\usepackage[english]{babel}
\usepackage[backend=biber,style=numeric]{biblatex}
\usepackage{hyperref}
\addbibresource{\jobname.bib}
\addbibresource{library.bib}
\DeclareSourcemap{ % Used when .bib/Bibliography is compiled, not when document is
\maps[overwrite, datatype=bibtex]{
\map{ % Replaces '{\_}', '{_}' or '\_' with just '_'
\step[fieldsource=url,
match=\regexp{\{\\\_\}|\{\_\}|\\\_},
replace=\regexp{\_}]
}
\map{ % Replaces '{'$\sim$'}', '$\sim$' or '{~}' with just '~'
\step[fieldsource=url,
match=\regexp{\{\$\\sim\$\}|\{\~\}|\$\\sim\$},
replace=\regexp{\~}]
}
\map{ % Replaces '{\$}'
\step[fieldsource=url,
match=\regexp{\{\\\x{26}\}},
replace=\regexp{\x{26}}]
}
}
}
\begin{document}
\nocite{enc2015}
\printbibliography
\end{document}
推理
因此,与问题中上面所写的内容相比,此版本使用字符的直接转义。即\\
and\_
而不是\textbackslash
and \textunderscore
。我最初尝试过这个,但没有成功,现在我一定做了一些略有不同的事情。
我的一个理论是,这是因为\t
转换为 TAB 字符导致\regexp
搜索<tab>extbackslash
and<tab>extunderscore
而不是\
and_
字符。
概括
对于那些在使用 Mendeley 处理 URL 中的转义字符时遇到麻烦的人,通过使用 Biber 和 BibLaTeX,可以使用以下代码片段来取消转义那些令人讨厌的_
,~
和&
人物。
在我使用的 Mendeley 版本 (v1.16.1) 中,这些字符被转义为{\_}
和{~}
。不过,在寻找解决方案时,我已包含对其他问题和互联网上报告的较旧的\_
和转义序列的支持。$\sim$
% This snippet must be in the preamble.
\usepackage[english]{babel} % untested with other languages
\usepackage[backend=biber]{biblatex}
\usepackage{hyperref} % for clickable urls
\addbibresource{library.bib} % Mendeley BibTeX library
\DeclareSourcemap{
\maps[overwrite, datatype=bibtex]{
\map{ % Replaces '{\_}', '{_}' or '\_' with just '_'
\step[fieldsource=url,
match=\regexp{\{\\\_\}|\{\_\}|\\\_},
replace=\regexp{\_}]
}
\map{ % Replaces '{'$\sim$'}', '$\sim$' or '{~}' with just '~'
\step[fieldsource=url,
match=\regexp{\{\$\\sim\$\}|\{\~\}|\$\\sim\$},
replace=\regexp{\~}]
}
\map{ % Replaces '{\$}'
\step[fieldsource=url,
match=\regexp{\{\\\x{26}\}},
replace=\regexp{\x{26}}]
}
}
}
希望这可以帮助其他人解决这个问题。
在较新版本的 biber/biblatex 中,可以将其扩展到包括可能包含问题字符的其他字段,例如doi
,使用foreach
说明符:
\map[overwrite, foreach={url,doi}]{ % Replaces '{\_}', '{_}' or '\_' with just '_'
\step[fieldsource=\regexp{$MAPLOOP},
match=\regexp{\{\\\_\}|\{\_\}|\\\_},
replace=\regexp{\_}]
}
答案2
答案3
最好让 Mendeley 使用括号来转义这些符号。就我而言,我在使用 Latex 中的 Springer 模板时遇到了参考文献中的 URL 问题,因此我想到处理参考文献文件(以下简称ref.bib
)并替换这些错误的括号用法,具体来说,受影响的字段类似于url
或doi
。
解决方案是:
$ sed --version
sed (GNU sed) 4.2.2
$ cat ref.bib
...
url = {http://link.springer.com/10.1007/3-540-48256-3{\_}21},
...
$ sed -i.backup "/^(url|doi)/ s/{.\?\(.\)}/\1/g" ref.bib
$ cat ref.bib
...
url = {http://link.springer.com/10.1007/3-540-48256-3_21},
...
希望对您有所帮助。如果需要澄清,请告诉我。
答案4
除了在 Mendeley 中禁用“转义 LaTeX 特殊字符(#{}%& 等)”选项外,我还删除了与“yourdocumentname.tex”相关的“yourdocumentname.bbl”文件并重新编译。对我来说,这很管用。但它不适用于期刊名称中的“&”字符。我通过在此类字符前面加上“”来解决这个问题。幸运的是,这并不那么耗时。