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

정규식을 사용하여 일치하고 바꾸면 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}]

하지만 imho는 훨씬 덜 명확합니다.

물결표에 대한 내용은 다음과 같습니다.

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

그러나 물결표가 정규식의 특수 문자인지 모르는 경우 추가 백슬래시가 해를 끼치지 않습니다.

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

관련 정보