Para reeditar um documento em uma linguagem construída (flexão senoidal latina), preciso de espaçamento de pontuação "francês"sem efeitos colaterais.
Mais especificamente, quero um pequeno espaço inseparável antes de qualquer sinal de pontuação duplo - : ; ! ?
- e um espaço inseparável regular após uma abertura ou antes de uma aspa de fechamento (guillemet) - «
e »
.
Responder1
Pois pdflatex
você pode usar a solução baseada na alteração do código de categoria dos 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}
O comando \frenchpunct
torna os caracteres :
, ;
e ativos e, em seguida ?
, !
define-os de acordo com o comportamento desejado: espaço fino inquebrável antes do caractere. Além disso, este comando redefine comandos \guillemotleft
e \guillemotright
aqueles são declarados por inputenc
pacote.
Comando \nofrencpunct
mude tudo de volta.
Observação:o comando acima \frenchpunct
é local. Portanto, sendo cercado por personagens tateantes, {}
ele tira seu efeito após sair do grupo. Se você precisar de um comando global que seja cancelado apenas por \nofrenchpunct
add \global
before all \def
(ou use \gdef
esse alias para \global\def
), \catcode
e \let
na \frenchpunct
definição:
\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
}
E faça o mesmo para \nofrenchpunct
:
\def\nofrenchpunct{%
\global\catcode`\:=12
\global\catcode`\;=12
\global\catcode`\?=12
\global\catcode`\!=12
\global\let\guillemotleft\gll
\global\let\guillemotright\glr
}
Responder2
Aqui está uma solução baseada em LuaLaTeX. Consiste em uma função Lua chamada french_punctuation_spacing
que faz todo o trabalho e duas macros utilitárias LaTeX chamadas \FrenchPunctuationSpacingOn
e \FrenchPunctuationSpacingOff
, respectivamente, que ativam e desativam a função 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}