我尝试在参考书目中添加一个 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
作为第二个参数。
对于书目条目中的 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}
/
为了允许在 之后(但不能在 中的两个斜杠之间)换行,//
我们使用以下\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},
}