如何禁用 URL 中的百分比编码?

如何禁用 URL 中的百分比编码?

我尝试在参考书目中添加一个 unicode URL,LaTeX 会自动将西里尔字母转换为百分号编码。我发现超链接对此负责,但我找不到禁用它的方法。对链接本身进行编码是可以的,但在文档中我不需要这样做,读者希望看到字母而不是字符代码。我真的不想把它打印https://ru.wikipedia.org/wiki/SLAM_(%D0%BC%D0%B5%D1%82%D0%BE%D0%B4)在纸上,这不会给读者提供任何有用的信息。

特克斯:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T2A]{fontenc}
\usepackage[english, russian]{babel}

\usepackage{biblatex}
\addbibresource{1.bib}

\begin{document}
Hello \cite{Wiki:SLAM}.
\printbibliography
\end{document}

1.围脖:

@InCollection{Wiki:SLAM,
  title     = {SLAM (метод)},
  booktitle = {Википедия~"--- свободная энциклопедия},
  organization = {Wikimedia Foundation, Inc.},
  address    = {США},
  date      = {2016-05-23},
  url       = {https://ru.wikipedia.org/wiki/SLAM_(метод)},
  urldate   = {2017-02-22},
  language  = {russian},
}

结果:

结果

我想要https://ru.wikipedia.org/wiki/SLAM_(метод)在 URL 中包含。

答案1

当前的 biber 知道该选项--nouri-encode,然后你得到这个

在此处输入图片描述

这也不是一个合理的输出。

使用像 lualatex 或 xelatex 这样的 unicode 引擎和这样的文档(并再次使用--nouri-encode

\documentclass{article}
\usepackage[english, russian]{babel}

\usepackage{biblatex}
\addbibresource{test.bib}
\usepackage{fontspec}
\setmainfont{Arial Unicode MS} %something with cyrillic 
\setmonofont{Arial Unicode MS} %something with cyrillic
\begin{document}
Hello \cite{Wiki:SLAM}.
\printbibliography
\end{document}

在此处输入图片描述

在文档中添加 hyperref 将产生相同的输出,但链接将是错误的:

在此处输入图片描述

编辑

正如评论所明确指出的那样,需要 pdflatex 解决方案,以下是一些背景信息:正如以下示例所示,url.sty无法以可靠的方式打印非 ASCII 字符。根据周围的语言(也取决于 hyperref 等包),您会得到各种错误的输出。

获得完美输出的唯一方法是手工制作。这意味着,如果您想要从 bib 文件中获取此输出,则必须将 url 的打印版本放在某个额外字段中,并更改 url 的 biblatex 宏以使用它们。

\documentclass[parskip=half-]{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage[T1, T2A]{fontenc}
\usepackage[english,russian]{babel}
\usepackage{url}

\begin{document}

\minisec{Russian / T2A-encoding}

normal text:
https://ru.wikipedia.org/wiki/SLAM\_(метод)

url: \url{https://ru.wikipedia.org/wiki/SLAM_(метод)} %wrong output

{%correct output, \babelhyphen{empty} for breakpoint, _ has been escaped to \_
  \fontencoding{T1}\ttfamily
  https://\babelhyphen{empty}ru.\babelhyphen{empty}wikipedia.\babelhyphen{empty}org/%
  \babelhyphen{empty}wiki/\babelhyphen{empty}SLAM\_({\fontencoding{T2A}\selectfont метод})
}

\selectlanguage{english}
\minisec{English / T1-encoding}

normal text: % https://ru.wikipedia.org/wiki/SLAM\_(метод) %errors

url: \url{https://ru.wikipedia.org/wiki/SLAM_(метод)} %wrong output  

{%correct output, \babelhyphen{empty} for breakpoint, _ has been escaped to \_
 \fontencoding{T1}\ttfamily
  https://\babelhyphen{empty}ru.\babelhyphen{empty}wikipedia.\babelhyphen{empty}org/%
  \babelhyphen{empty}wiki/\babelhyphen{empty}SLAM\_({\fontencoding{T2A}\selectfont метод})
} 
\end{document}

在此处输入图片描述

答案2

使用 XeLaTeX,实际上有一个解决方案。

\documentclass{article}

\usepackage[english, russian]{babel}
\usepackage{biblatex}
\usepackage{libertine}
\usepackage{hyperref}
\urlstyle{same} % to use a font with Cyrillic characters

\addbibresource{1.bib}

\DeclareFieldFormat{url}{%
  \mkbibacro{URL}\addcolon\space
  \href{#1}{\nolinkurl{\thefield{urlraw}}}}


\begin{document}
Hello \cite{Wiki:SLAM}.
\printbibliography
\end{document}

(文件1.bib如上。)代码使用了 biber 的新功能(从 2.8 版开始):它在字段中提供原始的、未转换的 URL 数据urlraw(顺便说一句,不再有选项--nouri-encode)。我们重新定义了url要调用的字段格式化程序,\href并将数据urlraw作为第二个参数。

1.png


对于书目条目中的 CJK 字符也有一个简单的解决方案。

首先,文件2.bib

@online{Gakushyu,
  author  = {Wikipedia},
  title   = {学習指導要領 [Gakushū-shidō-yōryō]},
  langid  = {japanese},
  date    = {2017-12-24},
  url     = {https://ja.wikipedia.org/wiki/学習指導要領#2020年(平成32年)_-},
  urldate = {2018-01-15},
}

这里有一个输入示例。

\documentclass{article}

\usepackage[english]{babel}
\usepackage{biblatex}
\usepackage[CJKmath]{xeCJK}
\usepackage{libertine}
\usepackage{hyperref}

\addbibresource{2.bib}
\setCJKmainfont{ipam.ttf}

\DeclareFieldFormat{url}{%
  \mkbibacro{URL}\addcolon\space
  \href{#1}{\nolinkurl{\thefield{urlraw}}}}


\begin{document}
Hello \cite{Gakushyu}.
\printbibliography
\end{document}

\url(和\nolinkurl)以数学模式处理 URL,并且选项CJKmath激活 CJK 数学支持。

中日韩

一个小缺点是 CJK 字符串不能被破坏。在大多数情况下,这不应该是一个问题。但是,如果你真的需要它,那么就需要一个更复杂的解决方案来避免\nolinkurl

\documentclass{article}

\usepackage[english]{babel}
\usepackage{biblatex}
\usepackage{xeCJK}
\usepackage{libertine}
\usepackage{hyperref}

\addbibresource{2.bib}
\setCJKmainfont{ipam.ttf}

\begingroup
  \XeTeXinterchartokenstate = 1
  \newXeTeXintercharclass \urlBreakClass
\endgroup

\DeclareFieldFormat{url}{%
  \begingroup
    \XeTeXinterchartokenstate = 1
    \XeTeXcharclass `\/ \urlBreakClass
    \XeTeXinterchartoks \urlBreakClass 0 {\allowbreak}%
    \XeTeXinterchartoks \urlBreakClass 1 {%
      \allowbreak
      \csname xeCJK_class_group_begin:\endcsname
      \csname xeCJK_select_font:\endcsname
      \csname xeCJK_clear_inter_class_toks:nn\endcsname{Default}{CJK}%
      \csname xeCJK_clear_Boundary_and_CJK_toks:\endcsname
      \CJKsymbol}%
    \mkbibacro{URL}\addcolon\space\href{#1}{\thefield{urlraw}}%
  \endgroup}


\begin{document}
Hello \cite{Gakushyu}.
\printbibliography
\end{document}

2.png

/为了允许在 之后(但不能在 中的两个斜杠之间)换行,//我们使用以下\XeTeXcharclass功能:我们为 定义一个新的字符类/,然后调用 以查看\allowbreak是否从 转换/为普通字符。如果需要,可以简单地将更多字符添加到新类中。

因为我们为 定义了一个单独的类/,所以 xeCJK 的机制不会应用于其后的字符,我们必须将相应的代码插入到我们的类标记列表中(这是一种黑客行为;希望将来会有更好的解决方案)。后面的五行\allowbreak取自文件xeCJK.sty(版本 3.5.1)第 740 行。由于 xeCJK 是用 LaTeX3 编写的,我们使用\csname来调用宏。请注意,上述代码仅涵盖最简单的情况,即/后面跟着一个普通的 CJK 字符(xeCJK 将其分配给类 1)。

答案3

两年过去了,仍然没有解决方案。我所能做的就是像这样手工制作实体:

@Misc{Wiki:SLAM,
    title        = {SLAM (метод) [Электронный ресурс] // Википедия~--- свободная энциклопедия},
    year         = {2016},
    howpublished = {URL: http://ru.wikipedia.org/wiki/SLAM\_(метод) (дата обр.~22.02.2017)},
    language     = {russian},
}

相关内容