\mkbibquote 바로 뒤에 콜론이 오면 따옴표를 닫지 않습니다.

\mkbibquote 바로 뒤에 콜론이 오면 따옴표를 닫지 않습니다.

다음 biblatex 레코드(최소 LaTeX 예제에 포함됨):

\begin{filecontents*}{\jobname.bib}
@article{test1,
Author = {Craft, Robert},
Title = {Stravinsky at His \mkbibquote{Bird-Best}: Robert Craft Untangles the Tales Surrounding the Creation of \foreignlanguage{french}{\mkbibemph{Le rossignol}}},
Journaltitle = {Opera News},
Date = {1982},
Volume = {46},
Number = {8},
Pages = {14-15, 34}
}
\end{filecontents*}
\documentclass{article}
\usepackage[autostyle=true, english=american, french=guillemets, german=guillemets]{csquotes}
\usepackage[french, german, american]{babel}
\usepackage{biblatex}
\addbibresource{\jobname.bib}
\begin{document}
\cite{test1}
\printbibliography
\end{document}

다음과 같이 잘못 렌더링되었습니다 pdflatex.

로버트 크래프트, “최고의 스트라빈스키: 로버트 크래프트가 창작을 둘러싼 이야기를 풀다르 로시뇰,'”오페라 뉴스, 1982, 아니. 8, 14–15, 34.

Bird-Best 뒤의 닫는 따옴표가 누락되었습니다.

그러나 에서는 lualatex그런 문제가 없습니다. 참조 형식이 올바르게 지정되었습니다.

로버트 크래프트, “'최고의 스트라빈스키': 로버트 크래프트가 창작을 둘러싼 이야기를 풀다르 로시뇰,”오페라 뉴스, 1982, 아니. 8, 14–15, 34.

biblatex나는 2.9a와 3.0을 포함하여 의 최신 안정 버전과 개발 버전을 모두 시도해 보았습니다 . 문제는 다음과 관련이 있을 가능성이 높습니다 csquotes.

저자인 PLK biblatex와 저는 이미 GitHub에서 이에 대해 논의했습니다(https://github.com/plk/biblatex/issues/259), 그러나 아직까지 원인을 추적할 수는 없습니다.

답변1

설명된 경우 '움직이는' 구두점을 사용하여 미국 스타일 인용에 사용하는 biblatex매크로를 사용합니다 . \blx@usqcheck구두점, 공백 등을 미리 확인하지만 다음 확인도 포함됩니다.

\if\noexpand\@let@token\relax
  \blx@usqcheck@i\blx@tempb
\fi

여기서 는 \blx@usqcheck@i\blx@tempb닫는 따옴표를 삽입하지 않지만 나중에 사용할 수 있도록 저장합니다. (위 코드를 공유하는 두 개의 내부 분기가 있으므로 즉시 명확하지는 않습니다.)

원저자는 biblatex이 코드가 무엇을 의미하는지에 대해 우리에게 메모를 남기지 않았지만 \relax구두점 이동을 방지하기 위해 명시적 코드를 사용하도록 허용하려는 의도인 것 같습니다.

\mkbibquote{some odd text}\relax ,

문제는 가 와 의미가 동일할 뿐만 아니라 매크로라면 구성이 \if\noexpand\foo\relax참이라는 것입니다 . ( 기본 요소는 매크로인 경우 일시적으로 동일 하지만 수행한 경우에는 동일하지 않습니다 .)\foo\relax\noexpand\foo\relax\let\foo=a

그것은 우리를 문제로 이끈다. pdfTeX가 사용 중이고 french옵션이 에 제공되면 babel문자 :는 '활성'이고 매크로 정의를 갖습니다.활성 언어가 프랑스어가 아니더라도. 따라서 테스트는 biblatex'잘못된 방향'으로 진행됩니다. 인용문 다음에 매크로를 찾고 이것이 완화된 것이라고 생각하고 닫는 구두점을 건너뜁니다. LuaTeX에서는 프랑스어 타이포그래피에 활성을 사용하지 않기 때문에 이런 일이 발생하지 않으므로 :문제가 결코 나타나지 않습니다.

제가 제안한 수정 사항은 올바른 위치에 두 번째 테스트를 짧은 패치로 추가하는 것입니다.

\makeatletter
\def\blx@usqcheck#1#2{%
  \def\blx@tempa{#1}%
  \def\blx@tempb{#2}%
  \ifx\@let@token\space
    \blx@usqcheck@i\blx@tempa
  \fi
  \ifx\@let@token\@sptoken
    \blx@usqcheck@i\blx@tempa
  \fi
  \if\noexpand\@let@token\relax
    \ifx\relax\@let@token
      \blx@usqcheck@i\blx@tempb
    \fi
  \fi
  \expandafter\blx@usqcheck@ii\blx@quotepunct\relax&}

\def\blx@usqcheck@i#1#2&{\fi#1}
\makeatother

이제 다음을 확인합니다.의미다음 매크로는 로 시작합니다 \relax. 여전히 잘못될 수 있는 경우가 있지만 현재로서는 이것이 '최저 위험' 수정처럼 보입니다. 내가 말했듯이, 부족한 것은 이 테스트가 왜 존재하는지에 대한 메모입니다. 추론이 무엇인지 즉시 명확하지 않습니다!

관련 정보