biblatex、hyperref 和标点符号问题

biblatex、hyperref 和标点符号问题

还有更多 biblatex 内容:我注意到,使用 hyperref 时,引用和标点符号(逗号或句号)之间存在难看的空格。请查看以下示例代码:

\begin{filecontents}{mybib.bib}
@book{JSmith,
author = {Smith, John},
title = {A book of}
}
\end{filecontents}

\documentclass{article}

\usepackage[style=authortitle]{biblatex}
\bibliography{mybib.bib}

\usepackage[colorlinks]{hyperref}

\begin{document}
Test~\cite*{JSmith}. Test~\footcite{JSmith}

Test~\emph{A book of}. Test\footnote{Smith, \emph{A book of}.}
\end{document}

有任何想法吗?


编辑:只是想让你知道,我也在这里发布了这个问题:http://groups.google.com/group/comp.text.tex/browse_thread/thread/908bd4ff3f8633b2#

我会让它们保持同步。


编辑2:Heiko Oberdiek 好心地解答了为什么会发生这种情况(在 comp.text.tex 上):

\cite*如果逗号或句号跟在 ( ) 后面,则使用\emph\emph抑制右端的斜体校正\nocorrlist。但是,添加链接意味着在它们之间添加内容(对于 hpdftex.def,有两个内容,链接结尾和恢复颜色。因此句号在 中被隐藏\emph

示例无比布拉特克斯

\documentclass[12pt]{article} 
\showboxdepth=\maxdimen 
\showboxbreadth=\maxdimen 
\usepackage[colorlinks]{hyperref} 

\begin{document} 
\section{Foo}\label{sec:foo} 
\huge 
\noindent 
Test~\emph{Smith of}.\\ 
Test~\hyperref[sec:foo]{\emph{Smith of}}. 

\tracingonline=1 
\showlists 
\end{document}

编辑3:Ulrike Fischer 提出了一个本地修复方案:

您可以本地重置定义\citetitle(如果您全局执行此操作,它也许会在您想要的地方删除斜体更正):

{\DeclareFieldFormat{citetitle}{\mkbibemph{#1\nocorr}}\cite*{JSmith}.}

答案1

我在 comp.text.tex 上收到了 Philipp Lehman 的回复:

meho_r写道:

那么,我们(用户)可以做些什么呢?

恐怕除了手动解决方法之外,没有太多办法。

\emph和朋友们使用一个相当简单的前瞻例程来决定是否需要斜体校正。简单的\relax会让人困惑。比较一下:

\emph{of}.  
\emph{of}\relax. 

添加斜体校正后,您所能做的就是手动将其删除。它是\kern,因此您可以使用\unkern

\emph{of}\relax\unkern. 

实际上,比布拉特克斯会自动执行此操作。如果您注释掉 超链接,你的例子就很好。

不幸的是,如果斜体文本是链接而标点符号不是链接的一部分,则此方法不起作用:

\href{http://www.foobar.com}{\emph{of}}.
\href{http://www.foobar.com}{\emph{of}}\unkern.

启动\unkern太晚了。它需要移动到链接组内部才能完成其工作:

\href{http://www.foobar.com}{\emph{of}\unkern}.

问题是:您需要删除链接组内的斜体更正,但您不知道是否需要在链接之后将其删除。

我看不出有什么方法可以自动处理这个问题。这些可能是深度嵌套的结构。链接末尾和标点符号之间可能有几十个标记和多个组。

您可以禁用链接(hyperref=false)或设置一个特殊 \cite命令,使用专用格式定义来抑制斜体校正。因此,根据 Ulrike 的建议,我的看法如下:

\DeclareFieldFormat{nocorremph}{\mkbibemph{#1\nocorr}}
\newrobustcmd{\nccite}{%   
\AtNextCite{\DeclareFieldAlias{citetitle}{nocorremph}}
\cite} 

现在比较一下:

\cite*{JSmith}.
\nccite*{JSmith}. 

虽然不太好,但是确实有效。

相关内容