
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 xetex
si cargo babel
con 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 polyglossia
y 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 soul
y la forma en que \XeTeXinterchartoks
se 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 babel
la definición 3.9 de), el error desaparece. Polyglossia utiliza allí \xpg@nospace
que 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 babel
de todos modos, no tiene nada de malo, particularmente ahora que la versión 3.9 presenta soporte para XeLaTeX.