Espaçamento francês sem babel ou poliglossia

Espaçamento francês sem babel ou poliglossia

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 pdflatexvocê 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}

insira a descrição da imagem aqui

O comando \frenchpuncttorna 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 \guillemotlefte \guillemotrightaqueles são declarados por inputencpacote.

Comando \nofrencpunctmude 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 \nofrenchpunctadd \globalbefore all \def(ou use \gdefesse alias para \global\def), \catcodee \letna \frenchpunctdefiniçã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_spacingque faz todo o trabalho e duas macros utilitárias LaTeX chamadas \FrenchPunctuationSpacingOne \FrenchPunctuationSpacingOff, respectivamente, que ativam e desativam a função Lua.

insira a descrição da imagem aqui

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

informação relacionada