Тонкий пробел в библиографии не работает при загрузке 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. \end, Illegal unit of measure (pt inserted). \end.

Может ли кто-нибудь подсказать, что можно сделать, чтобы разрешить использование тонких пробелов ( \,) в библиографических заголовках документов, подобных приведенному выше примеру?

решение1

biblate-ieeeприменимо \MakeSentenceCase*к заголовкам некоторых (но не всех) типов записей. @articleДля s заголовки преобразуются в предложения с заглавной буквой, а для @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}

Связанный контент