
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 xetex
se carregar babel
com 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 polyglossia
e 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 soul
e a forma como o \XeTeXinterchartoks
recurso é 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 babel
a definição 3.9), o erro desaparece. Polyglossia usa aí \xpg@nospace
que 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 babel
de qualquer maneira, não há nada de errado com isso, principalmente agora que a versão 3.9 introduz suporte ao XeLaTeX.