Французский интервал без бабеля или полиглоссии

Французский интервал без бабеля или полиглоссии

Чтобы повторно отредактировать документ на искусственном языке (латиноамериканский синус флексионе), мне нужны "французские" знаки препинаниябез побочных эффектов.

А именно, мне нужен небольшой неразрывный пробел перед любыми двойными знаками препинания -- : ; ! ?-- и обычный неразрывный пробел после открывающейся или перед закрывающейся кавычкой (guillemet) -- «и ».

решение1

Для этого pdflatexможно использовать решение, основанное на изменении кода категории символов:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
% saving original quotes representation
\let\gll\guillemotleft
\let\glr\guillemotright
% new quotes representation
\def\frenchguillemotleft{\gll~}
\def\frenchguillemotright{~\glr}
{
    \catcode`\:=\active
    \catcode`\;=\active
    \catcode`\?=\active
    \catcode`\!=\active
    \gdef\frenchpunct{%
        \catcode`\:=\active \def:{\thinspace\char`\: }
        \catcode`\;=\active \def;{\thinspace\char`\; }
        \catcode`\?=\active \def?{\thinspace\char`\? }
        \catcode`\!=\active \def!{\thinspace\char`\! }
        \let\guillemotleft\frenchguillemotleft
        \let\guillemotright\frenchguillemotright
    }
}
\def\nofrenchpunct{%
    \catcode`\:=12
    \catcode`\;=12
    \catcode`\?=12
    \catcode`\!=12
    \let\guillemotleft\gll
    \let\guillemotright\glr
}
\begin{document}
french: french; french? french!
«french»

\frenchpunct
french: french; french? french!
«french»

\nofrenchpunct
french: french; french? french!
«french»
\end{document}

введите описание изображения здесь

Команда \frenchpunctделает символы :, ;, ?и !активными, а затем определяет их в соответствии с желаемым поведением: неразрывный тонкий пробел перед символом. Также эта команда переопределяет команды, \guillemotleftи \guillemotrightте объявляются inputencпакетом.

Возвращаем \nofrencpunctвсе обратно.

Замечание:приведенная выше \frenchpunctкоманда является локальной. Поэтому, будучи заключенной в поисковые символы, {}она снимает свой эффект после выхода из группы. Если вам нужна глобальная команда, которая отменяется только \nofrenchpunctдобавлением \globalперед всеми \def(или использованием \gdefпсевдонима для \global\def), \catcodeи \letв \frenchpunctопределении:

\gdef\frenchpunct{%
    \global\catcode`\:=\active \gdef:{\thinspace\char`\: }
    \global\catcode`\;=\active \gdef;{\thinspace\char`\; }
    \global\catcode`\?=\active \gdef?{\thinspace\char`\? }
    \global\catcode`\!=\active \gdef!{\thinspace\char`\! }
    \global\let\guillemotleft\frenchguillemotleft
    \global\let\guillemotright\frenchguillemotright
}

И сделайте то же самое для \nofrenchpunct:

\def\nofrenchpunct{%
    \global\catcode`\:=12
    \global\catcode`\;=12
    \global\catcode`\?=12
    \global\catcode`\!=12
    \global\let\guillemotleft\gll
    \global\let\guillemotright\glr
}

решение2

Вот решение на основе LuaLaTeX. Оно состоит из функции Lua, которая называется , french_punctuation_spacingкоторая выполняет всю работу, и двух макросов утилит LaTeX, называемых \FrenchPunctuationSpacingOnи \FrenchPunctuationSpacingOff, соответственно, которые активируют и деактивируют функцию Lua.

введите описание изображения здесь

% !TEX TS-program = lualatex
\documentclass{article}
\usepackage{luacode}  % for 'luacode' environment
\begin{luacode}
function french_punctuation_spacing ( s )
  s = s:gsub ( "[:;!?]" , "\\,%0" )
  s = s:gsub ( "«" , "«~" )
  s = s:gsub ( "»" , "~»" )
  return s
end
\end{luacode}
\newcommand\FrenchPunctuationSpacingOn{\directlua{%
  luatexbase.add_to_callback ( "process_input_buffer",
  french_punctuation_spacing , "frenchpunctuationspacing" )}}
\newcommand\FrenchPunctuationSpacingOff{\directlua{%
  luatexbase.remove_from_callback ( "process_input_buffer",
  "frenchpunctuationspacing" )}}

%\usepackage{fontspec} % optional

\begin{document}
bonjour: monde; oui? non! «aujourd'hui»

\FrenchPunctuationSpacingOn % activate the Lua function
bonjour: monde; oui? non! «aujourd'hui»

\FrenchPunctuationSpacingOff % deactivate the Lua function
bonjour: monde; oui? non! «aujourd'hui»
\end{document}

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