かなり大きな .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{\~}}]