polyglossia 出现“! \xpg@nospace 的参数有一个额外的 }”错误消息

polyglossia 出现“! \xpg@nospace 的参数有一个额外的 }”错误消息

我使用一个代码(可在末尾找到)来表示法语传统的长引文。当我在这么长的引文中使用法语引号时,xetex如果我babel使用法语选项加载,编译时不会出现任何问题,错误消息

\xpg@nospace 的参数有一个额外的}。

加载时polyglossia。编译时也会发生同样的情况lualatex,,但错误消息不同,开头为

包灵魂错误:重建失败。

如果我在文档的序言中定义,问题就会消失:

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

如果将长引用中的法语引号替换为\og...。\fg

polyglossia所以我怀疑和之间存在冲突soul——或者我的使用方式soul。我首先在 fr.comp.text.tex 上发帖,但没有得到解决方案。

谨致问候,B. Alfonsi

代码(和最小示例):

\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

就 guillemets 而言,这似乎与法语 Polyglossia 的运作方式soul和功能实现方式不兼容。\XeTeXinterchartoks

如果我在序言的最后说

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

(基本上使用babel3.9 定义),错误消失。Polyglossia 在那里使用\xpg@nospace读取参数,这可能是造成混淆的原因soul

当然,这不适用于 LuaLaTeX,因为您需要babel。但是,我的建议是无论如何都要使用babel,它没有任何问题,特别是现在 3.9 版本引入了 XeLaTeX 支持。

相关内容