“! O argumento de \xpg@nospace possui uma mensagem de erro }” extra com poliglossia

“! O argumento de \xpg@nospace possui uma mensagem de erro }” extra com poliglossia

Utilizo um código – que se encontra no final – para citações longas na tradição francesa. Quando uso aspas francesas dentro de uma citação tão longa, não tenho problema em compilar xetexse carregar babelcom a opção francesa e a mensagem de erro

O argumento de \xpg@nospace possui um } extra.

ao carregar polyglossia. O mesmo acontece na compilação com lualatex,embora com uma mensagem de erro diferente, começando com

Erro da alma do pacote: falha na reconstrução.

O problema desaparece se eu definir no preâmbulo do documento:

\newcommand*{\og}{«{}} \newcommand*{\fg}{{}»}

e se as aspas francesas dentro da citação longa forem substituídas por \og\fg.

Portanto, suspeito que haja algum conflito entre polyglossiae soul– ou minha maneira de usar o soul. Postei pela primeira vez em fr.comp.text.tex, mas não obtive solução.

Atenciosamente, B. Alfonsi

Código (e exemplo mínimo):

\documentclass[a4paper,11pt, twoside]{article} 

\usepackage{fontspec}% f 
 \setmainfont{Minion Pro}% 
 %\usepackage[french]{babel} 
 \usepackage{polyglossia} 
 \setmainlanguage{french} 

\usepackage{soulutf8} 
 \usepackage {kvsetkeys} 
 \makeatletter 
 \newsavebox \citeguill@box 
 \define@key {citeguill}{left}[\guillemotleft]{\def\citeguill@left {#1}} 
 \define@key {citeguill}{right}[\guillemotright]{\def\citeguill@right {#1}} 
 \define@key {citeguill}{middle}[\hskip -\fontdimen2\font\mbox \guillemotright\hskip\fontdimen2\font]{\def\citeguill@middle 
 {\setbox\citeguill@box =\hbox {#1}\def\citeguill@middle {\copy 
 \citeguill@box }}% 
 }% \KV@citeguill@middle 
 \newcommand*\citeguillsetup [1]{\def\citeguill@setup {\kvsetkeys 
 {citeguill}{#1}}} 
 \let\citeguill@setup =\relax % 

\newcommand*\citeguill [1][]{% 
 \kvsetkeys{citeguill}{left,right,middle}\citeguill@setup% 
 \kvsetkeys{citeguill}{#1}% 
 \SOUL@setup% 
 \def\SOUL@preamble {\citeguill@middle \citeguill@left }% 
 \def\SOUL@postamble {\citeguill@right }% 
 \def\SOUL@everysyllable {\the\SOUL@syllable }% 
 \def\SOUL@everyspace ##1{##1\nobreak \ 
 \discretionary {\kern-\fontdimen 2\font } 
 {\citeguill@middle } 
 {}}% 
 \def\SOUL@everyhyphen {\discretionary% 
 {\SOUL@setkern \SOUL@hyphkern \SOUL@sethyphenchar } 
 {\citeguill@middle } 
 {}}% 
 \def\SOUL@everyexhyphen ##1{\SOUL@setkern \SOUL@hyphkern 
 \hbox{##1}\discretionary {} 
 {\citeguill@middle } 
 {\SOUL@setkern \SOUL@charkern }}% 
 \SOUL@% 
 }% \citeguill 
 \makeatother 

\begin{document} 

Pour conclure, les rédacteurs de \emph{L’Anti-Mythes} résument bien la question BHL 
telle qu’elle se pose à l’automne 1977 : \citeguill{Que le cynisme séduise, que la 
bêtise paie et que la mode soit au renouveau des idées les plus réactionnaires, cela 
ne suffit pas à expliquer l’extraordinaire exploitation par les médias du phénomène 
«nouveaux philosophes», ni leur impressionnant succès commercial.} 

\end{document}

Responder1

Esta parece ser uma incompatibilidade entre o funcionamento soule a forma como o \XeTeXinterchartoksrecurso é implementado na Polyglossia para o francês, no que diz respeito às guillemets.

Se eu disser no final do preâmbulo

\makeatletter
\appto\blockextras@french{%
  \XeTeXinterchartoks \french@punctguillstart 4095 = {\nobreakspace\ignorespaces}%
}
\appto\inlineextras@french{%
  \XeTeXinterchartoks \french@punctguillstart 4095 = {\nobreakspace\ignorespaces}%
}
\makeatother

(basicamente usando babela definição 3.9), o erro desaparece. Polyglossia usa aí \xpg@nospaceque lê um argumento, o que provavelmente é o que confunde soul.

É claro que isso não funciona com LuaLaTeX, para o qual você precisa do babel. No entanto, meu conselho é usar babelde qualquer maneira, não há nada de errado com isso, principalmente agora que a versão 3.9 introduz suporte ao XeLaTeX.

informação relacionada