参考书目中的细小空间在加载 amsmath 时不起作用(biblatex + IEEE 样式)

参考书目中的细小空间在加载 amsmath 时不起作用(biblatex + IEEE 样式)

相关GitHub plk / biblatex 问题 #910


\documentclass{article}

\usepackage{amsmath}

\usepackage[style=ieee]{biblatex}

\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
    @Article{A,
        title = {A\,b c},
    }
\end{filecontents}

\addbibresource{\jobname.bib}

\begin{document}
    Text~\cite{A}.
    \printbibliography
\end{document}

在此处输入图片描述

除了不正确的输出之外,使用 MiKTeX 进行编译还会以错误结束:Missing number, treated as zero. \endIllegal unit of measure (pt inserted). \end

有人可以提供一个想法,如何允许\,在像上面的例子这样的文档的书目标题中使用细空格()吗?

答案1

biblate-ieee适用\MakeSentenceCase*于某些(但不是全部)条目类型的标题。s@article的标题句子大小写,但@books 没有,这解释了评论中的观察结果。

\MakeSentenceCase是一个非常复杂且脆弱的宏,因为在 LaTeX 中字符串操作有些棘手。特别是\MakeSentenceCase执行大量扩展并尝试一次一个字符地遍历字符串。

标准 LaTeX 定义\,为一个强大的宏,但amsmath定义

\renewcommand{\,}{\tmspace+\thinmuskip{.1667em}}

这意味着\,可以扩展(一次)并且不稳健(其扩展是稳健的)。此扩展会导致机械方面出现一些问题,\MakeSentenceCase并产生您看到的错误。

有多种方法可以解决这个问题。

  1. 使其\,再次变得强大。问题

    \renewrobustcmd{\,}{\tmspace+\thinmuskip{.1667em}}
    

    加载后amsmath。(请注意,\renewrobustcmd需要etoolbox,在 MWE 中由 加载biblatex,因此此行应在加载amsmath和之后biblatex。)

  2. \protect\,文件中的这个.bib(正如建议的那样米科 在评论中

    @article{A,
      title = {A\protect\,b c},
    }
    
  3. 使用仍然受保护的其他命令(如建议的那样大卫·普顿 在评论中),例如biblatex\,等价物\addnbthinspace

    @article{A,
      title = {A\addnbthinspace b c},
    }
    
  4. \MakeSentenceCase您可以随时用花括号“隐藏”字符串的各部分。

    @article{A,
      title = {A{\,}b c},
    }
    

    有效,但我不确定是否推荐它。


这里有一个 MWE,用于测试无需的解决方案biblatex-ieee

\documentclass{article}

\usepackage{amsmath}
\usepackage[style=numeric]{biblatex}

\DeclareFieldFormat{titlecase}{\MakeSentenceCase*{#1}}

\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@article{A,
  title = {A\,b c},
}
\end{filecontents}
\addbibresource{\jobname.bib}

\begin{document}
  Text~\cite{A}.
  \printbibliography
\end{document}

相关内容