我承认,这是一个不寻常的问题,大多数人都想做相反的事情。但是,我经常使用一些较旧的工具,这些工具并不总是能很好地处理 Unicode,所以最好只使用纯 ASCII,而不必费力地让 Unicode 工作。作为参考,这是我的 MWE(使用 LuaLaTex 编译):
\documentclass{article}
\usepackage{fontspec}
\usepackage{lmodern}
\usepackage{hyperref}
\setmonofont{Latin Modern Mono Prop}
\UndeclareUTFcomposite{x0233}{\=}{y}
\makeatletter
\g@addto@macro\UrlSpecials{\do\ȳ{\=y}}
\makeatother
\usepackage[backend=biber,bibencoding=utf8,useprefix,mincrossrefs=1]{biblatex}
\usepackage{filecontents}
\begin{filecontents}{testbib.bib}
@online {mysite,
author = "John Doe",
date = "2016-01-01",
url = "http://www.\=y.com/",
organization = "My Website",
}
\end{filecontents}
\DeclareSourcemap{
\maps[datatype=bibtex]{
\map{
\step[fieldsource=url]
\step[fieldset=verba, origfieldval]
}
}
}
\DeclareFieldFormat{url}{\mkbibacro{URL}\addcolon\space\url{\thefield{verba}}}
\addbibresource{testbib.bib}
\begin{document}
\cite{mysite}
\printbibliography
\end{document}
注意:\DeclareSourcemap
和\DeclareFieldFormat
命令是为了防止 URL 被转换为 URI 转义,我们可以忽略它。
问题在于命令\g@addto@macro\UrlSpecials{\do\ȳ{\=y}}
。现在,显然,这是一个相当简单的例子,但我想弄清楚这是否可以供将来参考。我想要的是这样的:
\newcommand{\ym}{\char"0233} % U+0233 is the codepoint for ȳ
\makeatletter
\g@addto@macro\UrlSpecials{\expandafter\do\csname \ym\endcsname{\=y}}
\makeatother
不幸的是,这行不通。有什么想法可以让我实现我想要的功能吗?这样的事可能吗?
答案1
你可以总是输入范围内的 Unicode 字符x0
–xFFFF
如
^^^^xyzw
xyzw
四个十六进制在哪里小写数字。对于上面的字符,x10000
必须使用^^^^^^xyzuvw
,包含六个十六进制数字。因此,字符 U+0233 可以表示为 ,^^^^0233
而 U+FFFF 可以表示为^^^^ffff
。
x0
实际上,在 Knuth TeX 中,-范围内的字符xFF
也可以表示为^^xy
。重要的是,它的^
类别代码为 7(通常在文档序言中)。
在你的情况下
\makeatletter
\g@addto@macro\UrlSpecials{\expandafter\do\^^^^0233{\=y}}
\makeatother
会做。
答案2
感谢 Joseph Wright 的建议,我找到了使用\Uchar
命令的解决方案。
\documentclass{article}
\usepackage{fontspec}
\usepackage{lmodern}
\usepackage{hyperref}
\setmonofont{Latin Modern Mono Prop}
\UndeclareUTFcomposite{x0233}{\=}{y}
\makeatletter
\g@addto@macro\UrlSpecials{\expandafter\do\csname \Uchar"0233\endcsname{\=y}}
\makeatother
\usepackage[backend=biber,bibencoding=utf8,useprefix,mincrossrefs=1]{biblatex}
\usepackage{filecontents}
\begin{filecontents}{testbib.bib}
@online {mysite,
author = "John Doe",
date = "2016-01-01",
url = "http://www.\=y.com/",
organization = "My Website",
}
\end{filecontents}
\DeclareSourcemap{
\maps[datatype=bibtex]{
\map{
\step[fieldsource=url]
\step[fieldset=verba, origfieldval]
}
}
}
\DeclareFieldFormat{url}{\mkbibacro{URL}\addcolon\space\url{\thefield{verba}}}
\addbibresource{testbib.bib}
\begin{document}
\cite{mysite}.
\printbibliography
\end{document}