![在 biblatex (和 fnpct) 中,如果使用颜色命令,移动标点符号的功能会中断](https://linux22.com/image/394259/%E5%9C%A8%20biblatex%20(%E5%92%8C%20fnpct)%20%E4%B8%AD%EF%BC%8C%E5%A6%82%E6%9E%9C%E4%BD%BF%E7%94%A8%E9%A2%9C%E8%89%B2%E5%91%BD%E4%BB%A4%EF%BC%8C%E7%A7%BB%E5%8A%A8%E6%A0%87%E7%82%B9%E7%AC%A6%E5%8F%B7%E7%9A%84%E5%8A%9F%E8%83%BD%E4%BC%9A%E4%B8%AD%E6%96%AD.png)
Biblatex 默认 ( ) 会移动标点符号以用于上标引用。但是,通过或通过autopunct = true
更改上标的颜色(需要额外分组)会破坏此功能。我注意到这种情况甚至也会发生在 上。从 MWE 中可以看出,所有在标点符号后添加彩色上标的尝试都失败了(第 2 至第 4 行)。有什么想法可以解决这个问题吗?\textcolor
\color
fnpct
\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
和这样的包装器命令都是不好的做法。相反,我们可以将包装器参数用于。的原始定义可以在中找到,我们只需更改包装器\testB
biblatex
\...cite
\DeclareCiteCommand
\supercite
numeric.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}