在 biblatex (和 fnpct) 中,如果使用颜色命令,移动标点符号的功能会中断

在 biblatex (和 fnpct) 中,如果使用颜色命令,移动标点符号的功能会中断

Biblatex 默认 ( ) 会移动标点符号以用于上标引用。但是,通过或通过autopunct = true更改上标的颜色(需要额外分组)会破坏此功能。我注意到这种情况甚至也会发生在 上。从 MWE 中可以看出,所有在标点符号后添加彩色上标的尝试都失败了(第 2 至第 4 行)。有什么想法可以解决这个问题吗?\textcolor\colorfnpct


\documentclass{article}
\usepackage{xparse}
\usepackage{xcolor}
\usepackage[
    %autopunct = true,  %that is the default setting
    autocite = superscript,
    hyperref=true
]{biblatex}
\addbibresource{biblatex-examples.bib}  


\NewDocumentCommand\testA{m}{%
    \begingroup\color{blue}\autocite{#1}\endgroup%
}%

\NewDocumentCommand\testB{m}{%
    \color{blue}\autocite{#1}%
}%


\begin{document}

This is a normal test \autocite{loh}. Things after. 

This is an inline with color test \textcolor{blue}{\autocite{loh}}. Things after.

This is a macro test \testA{loh}. Things after. 

This is a macro test \testB{loh}. Things after. 


\end{document}

在此处输入图片描述

编辑:作为我尝试重现的示例: https://www.nature.com/articles/s41699-019-0098-2.pdf

编辑2: 更清楚一点:我需要一个 pdf-a 版本(通过 pdfx)用于存档,一个 pdf-x 版本用于打印。许多 hyperref 功能(包括 citecolor)在 pdf-x 中被禁用,并且citecolor无法再使用 hyperref 选项。这里提到了更多细节: PDFX 的 X-4 选项不显示 PDF/X 选项的超链接颜色 (x-4)

答案1

\autocite的标点符号检测和移动功能的工作方式autopunct要求标点符号\autocite直接跟在后面,以便可以将其作为最终参数吸收。如果\autocite本身被包装在命令中,则它无法吸收包装器后的标点符号。理论上可以让包装器吸收标点符号并将其传递给,但我认为无论如何为命令\autocite编写像\testA和这样的包装器命令都是不好的做法。相反,我们可以将包装器参数用于。的原始定义可以在中找到,我们只需更改包装器\testBbiblatex \...cite\DeclareCiteCommand\supercitenumeric.cbx

\documentclass[12pt]{article}
\usepackage{xcolor}
\usepackage[
  autocite = superscript,
]{biblatex}
\addbibresource{biblatex-examples.bib}  

\newrobustcmd*{\mkbibcolouredsuperscript}[1]{%
  \textcolor{blue}{%
    \mkbibsuperscript{#1}}}

\DeclareCiteCommand{\supercite}[\mkbibcolouredsuperscript]
  {\iffieldundef{prenote}
     {}
     {\BibliographyWarning{Ignoring prenote argument}}%
   \iffieldundef{postnote}
     {}
     {\BibliographyWarning{Ignoring postnote argument}}}
  {\usebibmacro{citeindex}%
   \usebibmacro{cite}}
  {\supercitedelim}
  {}

\begin{document}
This is a normal test \autocite{loh}. Things after. 

This is an inline with color test \textcolor{blue}{\autocite{loh}}. Things after.
\end{document}

蓝色超恒星已标记在预期位置。


正如我在评论中提到的,如果你使用hyperref并且只想为引用链接着色,而不是引用本身

\usepackage[colorlinks,citecolor=blue]{hyperref}

可能是更好的解决方案。但在这种情况下,由于功能原因,这是不可能的pdfx


解决评论。相同的通用方法适用于所有样式。但所需的确切代码可能会有所不同,因为答案需要正确定义命令\...cite。因为numeric-comp我们需要

\DeclareCiteCommand{\supercite}[\mkbibcolouredsuperscript]
  {\usebibmacro{cite:init}%
   \let\multicitedelim=\supercitedelim
   \iffieldundef{prenote}
     {}
     {\BibliographyWarning{Ignoring prenote argument}}%
   \iffieldundef{postnote}
     {}
     {\BibliographyWarning{Ignoring postnote argument}}}
  {\usebibmacro{citeindex}%
   \usebibmacro{cite:comp}}
  {}
  {\usebibmacro{cite:dump}}

绝对地不推荐这样做,但既然您在评论中问到这个问题,这里有一个解决方案,展示了如何从包装器之后吸收标点符号命令并在之前进行排版\autocite

\documentclass[12pt]{article}
\usepackage{xcolor}
\usepackage[
  autocite = superscript,
]{biblatex}
\addbibresource{biblatex-examples.bib}  

\makeatletter
\newcommand*{\testaAautocite}[2]{%
  #2\unspace
  \textcolor{blue}{\autocite{#1}}}
\newcommand{\testA}[1]{%
  \blx@thecheckpunct{\testaAautocite{#1}}}
\makeatother

\begin{document}
This is a normal test \autocite{loh}. Things after. 

This is an inline with color test \textcolor{blue}{\autocite{loh}}. Things after.

This is a normal test \testA{loh}. Things after. 

This is a normal test \testA{loh} and non-punctuation afterwards.

This is a normal test \testA{loh}and non-punctuation afterwards.
\end{document}

相关内容