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 pdflatex
kö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}
Der Befehl \frenchpunct
aktiviert 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 \guillemotleft
und diese werden vom Paket \guillemotright
deklariert .inputenc
Befehl: \nofrencpunct
Alles zurück ändern.
Anmerkung:der obige Befehl ist lokal. Daher verliert er seine Wirkung, wenn \frenchpunct
er 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_spacing
die die ganze Arbeit erledigt, und zwei LaTeX-Hilfsmakros namens \FrenchPunctuationSpacingOn
bzw. \FrenchPunctuationSpacingOff
, die die Lua-Funktion aktivieren und deaktivieren.
% !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}