
Я использую код – который можно найти в конце – для длинных цитат во французской традиции. Когда я использую французские кавычки внутри такой длинной цитаты, у меня нет проблем с компиляцией, 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.