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 pdflatex
utilizar 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}
El comando \frenchpunct
activa 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 \guillemotleft
y \guillemotright
se declaran por inputenc
paquete.
Comando \nofrencpunct
cambiar todo de vuelta.
Observación:El comando anterior \frenchpunct
es 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 \nofrenchpunct
antes \global
de todo \def
(o use \gdef
ese alias para \global\def
), \catcode
y \let
en \frenchpunct
definició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_spacing
que hace todo el trabajo y dos macros de utilidad LaTeX llamadas \FrenchPunctuationSpacingOn
y \FrenchPunctuationSpacingOff
, respectivamente, que activan y desactivan la función 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}