Französische Abstandsregeln ohne Babel oder Polyglossie

Französische Abstandsregeln ohne Babel oder Polyglossie

Um ein Dokument in einer konstruierten Sprache erneut zu bearbeiten (latino Sinusflexion), brauche ich "französische" Satzzeichenabständeohne Nebenwirkungen.

Genauer gesagt möchte ich ein kleines geschütztes Leerzeichen vor jedem doppelten Satzzeichen -- : ; ! ?-- und ein normales geschütztes Leerzeichen nach einem öffnenden oder vor einem schließenden Anführungszeichen (Guillemet) -- «und ».

Antwort1

Sie pdflatexkönnen eine Lösung verwenden, die auf der Änderung des Kategoriecodes der Zeichen basiert:

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

Bildbeschreibung hier eingeben

Der Befehl \frenchpunctaktiviert die Zeichen :, ;, ?und !und definiert sie dann entsprechend dem gewünschten Verhalten: unumbrechbares schmales Leerzeichen vor dem Zeichen. Außerdem definiert dieser Befehl Befehle neu \guillemotleftund diese werden vom Paket \guillemotrightdeklariert .inputenc

Befehl: \nofrencpunctAlles zurück ändern.

Anmerkung:der obige Befehl ist lokal. Daher verliert er seine Wirkung, wenn \frenchpuncter von Grapschzeichen umschlossen ist, nachdem er die Gruppe verlassen hat. Wenn Sie einen globalen Befehl benötigen, der nur durch „add before all“ (oder verwenden Sie das als Alias ​​für ) abgebrochen wird, und in der Definition:{}\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
}

Und machen Sie dasselbe für \nofrenchpunct:

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

Antwort2

Hier ist eine LuaLaTeX-basierte Lösung. Sie besteht aus einer Lua-Funktion namens , french_punctuation_spacingdie die ganze Arbeit erledigt, und zwei LaTeX-Hilfsmakros namens \FrenchPunctuationSpacingOnbzw. \FrenchPunctuationSpacingOff, die die Lua-Funktion aktivieren und deaktivieren.

Bildbeschreibung hier eingeben

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

verwandte Informationen