I try to add a unicode URL into the bibliography and LaTeX automatically converts the cyrillyc letters into percent-encoding. I found that hyperref is responsible for this, but I found no way to disable it. It's OK to encode the link itself, but in document I don't need this, the reader wants to see letters instead of character codes. I really don't want to print this https://ru.wikipedia.org/wiki/SLAM_(%D0%BC%D0%B5%D1%82%D0%BE%D0%B4) on papaer, this gives no useful information to reader.

TeX:

\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.bib:

@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},
}

Result:

result

I want to have https://ru.wikipedia.org/wiki/SLAM_(метод) in the URL.

  • I still have trouble with this. Are there no solutions appeard after about two years? I even tried to use a usera field for URLs, but \DeclareFieldFormat{url}{\mkbibacro{URL}\addcolon\space\\thefield{usera}} did not work (( – Himura Dec 3 at 8:20

A current biber knows the option --nouri-encode and then you get this

enter image description here

which isn't a sensible output either.

With a unicode engine like lualatex or xelatex and such a document (and again with --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}

enter image description here

Adding hyperref to the document will give the same output but the link will be wrong:

enter image description here

Edit

As the comment made clear that pdflatex solution is needed some background info: As the following example demonstrates url.sty can't in a realiable way print non-ascii chars. Depending on the surrounding language (and also depending on packages like hyperref) you get all sorts of wrong output.

The only way to get a perfect output is to handcraft it. This means that if you want this from a bib-file you will have to put the print version of the url in some extra field and change the biblatex macros for the url to use them.

\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}

enter image description here

  • So there's no way to handle this in pure LaTex? – Himura Feb 22 '17 at 13:02
  • I should inform that I use fonts from pscyr and they absolutely support Cyrillic. Something strange is going on here and I start to think about a bug in biber – Himura Feb 22 '17 at 15:55
  • It is not biber but the url command. Try out \url{метод} with and without hyperref. – Ulrike Fischer Feb 22 '17 at 16:00
  • I tried and it did not produce percent encoding. It produced another unreadable result. Like cyrillic letters in LaTeX commands – Himura Feb 22 '17 at 16:08
  • 1
    That's sad... Well, maybe I really should switch to XeLaTeX, now when I think about it, I see that fonts in LaTeX make really much problems. Thanks for help. – Himura Feb 22 '17 at 16:26

Using XeLaTeX, there actually is a solution.

\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}

(The file 1.bib is as above.) The code uses a new feature of biber (starting with version 2.8): it provides the original, unconverted URL data in the field urlraw (and there is no longer an option --nouri-encode, BTW). We redefine the url field formatter to call \href with the data from urlraw as the second argument.

1.png


For CJK characters in bibliography entries there is also a simple solution.

First, the file 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},
}

And here an input example.

\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 (and \nolinkurl) handle URLs in math mode, and option CJKmath activates CJK support for math.

cjk.png

A minor disadvantage is that strings of CJK characters can't be broken. In most cases this shouldn't be a problem. However, if you really need that, a more elaborate solution is necessary that avoids \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

To allow line breaks after / (but not between the two slashes in //) we use the \XeTeXcharclass feature: We define a new character class for /, then calling \allowbreak if we have a transition from / to a normal character. It is straightforward to add more characters to the new class if desired.

Because we define a separate class for /, xeCJK's mechanism doesn't get applied to the character following it, and we have to insert the corresponding code into our class token list (this is a hack; hopefully, there will be a better solution in the future). The five lines after \allowbreak have been taken from file xeCJK.sty (version 3.5.1), lines 740ff. Since xeCJK is written in LaTeX3, we use \csname to call the macros. Note that the above code covers only the simplest case, namely / followed by an ordinary CJK character (which xeCJK assigns to class 1).

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.