Espaciado francés sin babel ni poliglosia

Espaciado francés sin babel ni poliglosia

Para volver a editar un documento en un lenguaje construido (latino sinusoidal flexione), necesito un espaciado de puntuación "francés"sin efectos secundarios.

Más específicamente, quiero un pequeño espacio sin separación antes de cualquier signo de puntuación doble, : ; ! ?y un espacio regular sin separación después de una comilla de apertura o antes de una comilla de cierre (guillemet), «y ».

Respuesta1

Puede pdflatexutilizar una solución basada en cambiar el código de categoría de caracteres:

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

ingrese la descripción de la imagen aquí

El comando \frenchpunctactiva los caracteres :, ;y ?y !luego los define según el comportamiento deseado: espacio fino irrompible antes del carácter. Además, este comando redefine los comandos \guillemotlefty \guillemotrightse declaran por inputencpaquete.

Comando \nofrencpunctcambiar todo de vuelta.

Observación:El comando anterior \frenchpunctes local. Por lo tanto, al estar rodeado de personajes manoseos, {}su efecto desaparece después de abandonar el grupo. Si necesita un comando global que se cancele solo agregando \nofrenchpunctantes \globalde todo \def(o use \gdefese alias para \global\def), \catcodey \leten \frenchpunctdefinición:

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

Y haz lo mismo para \nofrenchpunct:

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

Respuesta2

Aquí hay una solución basada en LuaLaTeX. Consiste en una función Lua llamada french_punctuation_spacingque hace todo el trabajo y dos macros de utilidad LaTeX llamadas \FrenchPunctuationSpacingOny \FrenchPunctuationSpacingOff, respectivamente, que activan y desactivan la función Lua.

ingrese la descripción de la imagen aquí

% !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}

información relacionada