Сообщение об ошибке «! Аргумент \xpg@nospace имеет лишнюю }» с полиглоссией

Сообщение об ошибке «! Аргумент \xpg@nospace имеет лишнюю }» с полиглоссией

Я использую код – который можно найти в конце – для длинных цитат во французской традиции. Когда я использую французские кавычки внутри такой длинной цитаты, у меня нет проблем с компиляцией, xetexесли я загружаю babelс французской опцией, и сообщение об ошибке

Аргумент \xpg@nospace имеет дополнительный символ }.

при загрузке polyglossia. То же самое происходит при компиляции с lualatex,другим сообщением об ошибке, начинающимся с

Ошибка пакета soul: Реконструкция не удалась.

Проблема исчезает, если я определю в преамбуле документа:

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

и если французские кавычки внутри длинной цитаты заменить на \og\fg.

Поэтому я подозреваю, что есть некий конфликт между polyglossiaи soul– или моим способом использования soul. Я сначала разместил сообщение на fr.comp.text.tex, но не получил решения.

С наилучшими пожеланиями, Б. Альфонси

Код (и минимальный пример):

\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}

решение1

Похоже, что это несовместимо с работой soulи тем, как эта \XeTeXinterchartoksфункция реализована в Polyglossia для французского языка, в отношении кайр.

Если я скажу в конце преамбулы

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

(в основном используя babelопределение 3.9), ошибка исчезает. Полиглоссия использует там, \xpg@nospaceчто читает аргумент, что, вероятно, и сбивает с толку soul.

Конечно, это не работает с LuaLaTeX, для которого вам нужен babel. Однако, я советую использовать его babelв любом случае, в этом нет ничего плохого, особенно теперь, когда версия 3.9 вводит поддержку XeLaTeX.

Связанный контент