Biber と Biblatex によるフィールド内のスペースの自動置換

Biber と Biblatex によるフィールド内のスペースの自動置換

かなり大きな .bib ファイルがあり、そのフィールドにはスペースが含まれている可能性があります (たとえば、「シリーズ」フィールドは「SIGMOD '99」になることがあります)。参考文献を印刷すると、これらのスペースで一部の行が分割されてしまい、見苦しい状態になります。私は Biblatex と Biber で XeLateX を使用しています。

これらのフィールド内のスペースを非改行スペースに自動的に置き換えたいのですが、 を使用しようとしましたDeclareSourcemapが、うまくいきませんでした。私が書いたのは次のとおりです。

\DeclareSourcemap{ 
  \maps[datatype=bibtex]{
    \map{
       \step[fieldsource=series,
            match={\ }, replace={~}]
      }
  }      
}

このコードは実際にはスペースを削除します ("SIGMOD '99" は "SIGMOD'99" と表示されます)。 と同じです\nobreakspace~を に置き換えると\,、 に似たものが生成されますSIGMOD-kern+.1667em elax ’00

renewbibmacroとでも成功しませんでしたStrSubstitute。私は次のものを使用しましたrenewbibmacro

\renewbibmacro*{series+number}{%
  \setunit*{\addnbspace}%
  \StrSubstitute{\printfield{series}}{ }{~}%
  \printfield{number}%
  \newunit}

何かアイデアはありますか? 良い実践方法についてのコメントにも興味があります。

編集: これが MWE です:

\documentclass[10pt]{article}

\usepackage{fontspec}
\usepackage[backend=biber]{biblatex}

\DeclareSourcemap{
  \maps[datatype=bibtex]{
    \map{
      \step[fieldsource=series,
            match={\ }, replace={\nobreakspace}]
      }
  }
}

\begin{filecontents}{bib1.bib}
@article{some:article:1964,
    author   = "Mister Smart",
    title    = {A very difficult narrative of sub-atomic particles in the diary of Louis XIV},
    journal  = {Journal for Advanced Thinking},
    series = {SIGMOD '99},
}
\end{filecontents}
\addbibresource{./bib1.bib}

\begin{document}
Here is an example of text \cite{some:article:1964}.
\printbibliography
\end{document}

コンパイルすると、フィールド内のスペースが消えることがわかりますseries。これを非改行スペースに置き換えます。

答え1

match と replace は正規表現を使用し、LaTeX も入力を認識します。そのため、すべての特殊な正規表現と LaTeX 入力を正しくエスケープしないと、おかしなことが起こる可能性があります。通常は、すべてをコマンドに入れてから\regexp正規表現エスケープ (たとえば、改行として)\\nを使用するのが最適です。\n

次のソースマップを使用できます:

\DeclareSourcemap{
  \maps[datatype=bibtex]{
    \map{
      \step[fieldsource=series,
            match={\regexp{\s}}, replace={\regexp{\\nobreakspace\x20}}]
      }
  }
}

これにより、bbl に次のエントリが生成されます。

\field{series}{SIGMOD\nobreakspace '99}

\x20文字が続く場合に問題を回避するために、コマンドの後にリテラルスペースが挿入されます。

代替案としては

 match={\ }, replace={\string\\nobreakspace\string\x20}]

しかし、私見では、それはあまり明確ではありません。

これはチルダ用です:

 match={\regexp{\s}}, replace={\regexp{~}}]

しかし、正規表現でチルダが特殊文字であるかどうかわからない場合は、バックスラッシュを追加しても問題はありません。

match={\regexp{\s}}, replace={\regexp{\~}}]

関連情報