필드에 공백이 포함될 수 있는 꽤 큰 .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{\~}}]