介绍

介绍

介绍

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\_而不是\textbackslashand \textunderscore。我最初尝试过这个,但没有成功,现在我一定做了一些略有不同的事情。

我的一个理论是,这是因为\t转换为 TAB 字符导致\regexp搜索<tab>extbackslashand<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

似乎在 Mendeley 1.17.2 中,现在可以禁用逃避恐怖。禁用此字段对我有用...

在此处输入图片描述

答案3

最好让 Mendeley 使用括号来转义这些符号。就我而言,我在使用 Latex 中的 Springer 模板时遇到了参考文献中的 URL 问题,因此我想到处理参考文献文件(以下简称ref.bib)并替换这些错误的括号用法,具体来说,受影响的字段类似于urldoi

解决方案是:

$ 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”文件并重新编译。对我来说,这很管用。但它不适用于期刊名称中的“&”字符。我通过在此类字符前面加上“”来解决这个问题。幸运的是,这并不那么耗时。

相关内容