“¡! El argumento de \xpg@nospace tiene un mensaje de error adicional}” con poliglosia

“¡! El argumento de \xpg@nospace tiene un mensaje de error adicional}” con poliglosia

Utilizo un código (que se encuentra al final) para citas largas en la tradición francesa. Cuando uso comillas francesas dentro de una cita tan larga, no tengo ningún problema al compilar xetexsi cargo babelcon la opción francesa y aparece el mensaje de error.

El argumento de \xpg@nospace tiene un }.

al cargar polyglossia. Lo mismo sucede al compilar con lualatex,aunque con un mensaje de error diferente, comenzando con

Error del alma del paquete: Error en la reconstrucción.

El problema desaparece si defino en el preámbulo del documento:

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

y si las comillas francesas dentro de la cita larga se reemplazan por \og\fg.

Entonces sospecho que hay algún conflicto entre polyglossiay soul– o mi forma de usar soul. Publiqué por primera vez en fr.comp.text.tex, pero no obtuve ninguna solución.

Saludos cordiales, B. Alfonsi

Código (y ejemplo 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}

Respuesta1

Esto parece ser una incompatibilidad entre el funcionamiento souly la forma en que \XeTeXinterchartoksse implementa la función en Polyglossia para francés, con respecto a los guillemets.

Si digo al final del preámbulo

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

(básicamente usando babella definición 3.9 de), el error desaparece. Polyglossia utiliza allí \xpg@nospaceque lee un argumento, que probablemente sea lo que confunde soul.

Por supuesto, esto no funciona con LuaLaTeX, para lo cual necesitas babel. Sin embargo, mi consejo es usarlo babelde todos modos, no tiene nada de malo, particularmente ahora que la versión 3.9 presenta soporte para XeLaTeX.

información relacionada