
タイトルがすべてを物語っていますが、\ignorespaces
のようにスペースを無視し、 を含めるにはどうすればよいでしょうか~
?
私が質問する理由は、複数の著者が文書を書いているのですが、ソース コード内でのフランス語のギュイメ記号の入力に関して著者らの習慣が異なっており (つまり、、«bla»
および« bla »
) «~bla~»
、適切な定義で を設定することでこれを統一したいからです\newunicodechar{«}
。
終了時のギルメットは、\unskip
すべてのケースで効果があるようです。
答え1
これは LuaLaTeX ベースのソリューションです。ほとんどの作業を実行する Lua 関数と、Lua 関数をアクティブ化および非アクティブ化する LaTeX ユーティリティ マクロをいくつか定義します。「アクティブ化」とは、「Lua 関数を LuaTeX のprocess_input_buffer
コールバックに割り当てる」ことを意味し、入力ストリームのプリプロセッサとして機能します。前にTeX は通常の処理を開始します。
% !TEX TS-program = lualatex
\documentclass{article}
\usepackage[french]{babel} % for "\og" and "\fg" macros
\usepackage[french=guillemets]{csquotes} % for "\enquote" macro
\usepackage{luacode} % for "luacode" environment
%% Lua-side code
\begin{luacode}
function delete_whitespace ( s )
s = s:gsub ( "«[ ~]*" , "\\og " )
s = s:gsub ( "[ ~]*»" , "\\fg " )
-- s = s:gsub ( "[ ~]+([%:%;%?%!])" , "%1" ) -- if needed
return s
end
\end{luacode}
%% LaTeX-side code
\newcommand\DeletewhitespaceOn{\luadirect{luatexbase.add_to_callback (
"process_input_buffer", delete_whitespace , "deletewhitespace" )}}
\newcommand\DeletewhitespaceOff{\luadirect{luatexbase.remove_from_callback (
"process_input_buffer", "deletewhitespace" )}}
\AtBeginDocument{\DeletewhitespaceOn} % enable by default
\begin{document}
\enquote{bla} \og{}bla\fg{} «bla» « bla » «~bla~» «~ bla ~ »
\DeletewhitespaceOff
\enquote{bla} \og{}bla\fg{} «bla» « bla » «~bla~» «~ bla ~ »
\end{document}
答え2
expl3 を使用すると非常に簡単です (ただし、関連する関数の汎用性が極めて高いため、パフォーマンスは理想的ではない可能性があります)。
%! TEX program = lualatex
\documentclass{article}
\usepackage{newunicodechar}
\ExplSyntaxOn
\newunicodechar{×}{123\ignorespaces}
\newunicodechar{≡}{123\peek_regex_remove_once:nT{(\cA\~|\cS\ )+}{}}
\ExplSyntaxOff
\begin{document}
× 456
×~456 %unfortunately does not work
% all of the below works:
≡ 456
≡~456
≡~~456
≡~ ~ 456
\end{document}
ここでは、説明のために、無関係な Unicode 文字を 2 つ使用します。
正規表現をプリコンパイルすることでパフォーマンスを少し最適化できます。
\regex_new:N \l_ysalmon_regex
\regex_set:Nn \l_ysalmon_regex {(\cA\~|\cS\ )+}
\newunicodechar{≡}{123\peek_regex_remove_once:NT\l_ysalmon_regex{}}
(変数名は OP のユーザー名に基づいて付けられます。必要に応じて変更してください)
関数peek
ファミリは、一部の特殊なケースを正しく処理しませんが、これは非常にまれなため、実際に発生することは事実上不可能です。
答え3
開始ギユメットの後のものを削除するよりも、終了ギユメットの前のすべてのグルー、カーニング、ペナルティを削除する方が簡単です。
いずれにせよ、これはかなり効率的であるはずです。
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{newunicodechar}
\newunicodechar{«}{<<\ignoreallspaces}
\newunicodechar{»}{\removeallspaces~>>}
\ExplSyntaxOn
\NewDocumentCommand{\removeallspaces}{}
{
\int_case:nnT { \lastnodetype }
{
{11}{\unskip}
{12}{\unkern}
{13}{\unpenalty}
}
{\removeallspaces}
}
\NewDocumentCommand{\ignoreallspaces}{}
{
\peek_remove_filler:n { \peek_charcode_remove:NT \c_tilde_str { \ignoreallspaces } }
}
\ExplSyntaxOff
\begin{document}
« ~ a ~~ »
\end{document}