以建構語言重新編輯文檔(拉丁正弦屈曲),我需要「法語」標點間距無副作用。
更具體地說,我想在任何雙標點符號之前有一個小的不間斷空格 -- : ; ! ?
-- 以及在開始或結束引號 (guillemet) 之前有一個常規的不間斷空格 --«
和»
。
答案1
您pdflatex
可以使用基於更改字元類別代碼的解決方案:
\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}
指令\frenchpunct
使字元:
、;
和?
處於!
活動狀態,然後根據所需的行為定義它們:字元前牢不可破的薄空格。此命令也重新定義命令\guillemotleft
,\guillemotright
這些命令是由inputenc
套件聲明的。
命令\nofrencpunct
全部更改回來。
評論:上面的\frenchpunct
命令是本地的。因此,被摸索字符包圍後,{}
它在離開組後就消失了。如果您需要僅透過在所有之前\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
}
並做同樣的事情\nofrenchpunct
:
\def\nofrenchpunct{%
\global\catcode`\:=12
\global\catcode`\;=12
\global\catcode`\?=12
\global\catcode`\!=12
\global\let\guillemotleft\gll
\global\let\guillemotright\glr
}
答案2
這是一個基於 LuaLaTeX 的解決方案。它由一個名為 的 Lua 函數french_punctuation_spacing
(完成所有工作)和兩個 LaTeX 實用程式巨集(分別名為\FrenchPunctuationSpacingOn
和\FrenchPunctuationSpacingOff
)組成,用於啟動和停用 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}