
O título diz tudo, como posso ignorar espaços, como \ignorespaces
acontece, mas incluindo um ~
?
A razão pela qual pergunto é que somos vários autores escrevendo um documento e eles têm hábitos diferentes em relação à digitação de guilhotinas francesas em seu código-fonte (ou seja, «bla»
, « bla »
e «~bla~»
), e quero unificar isso definindo a \newunicodechar{«}
com a definição apropriada.
Para o fechamento da guilhotina, \unskip
parece funcionar em todos os casos.
Responder1
Aqui está uma solução baseada em LuaLaTeX. Ele define uma função Lua que faz a maior parte do trabalho, além de algumas macros utilitárias LaTeX que ativam e desativam a função Lua. Por "ativar", quero dizer "atribuir a função Lua ao process_input_buffer
retorno de chamada do LuaTeX", para que ela possa atuar como um pré-processador no fluxo de entradaantesTeX inicia seu processamento normal.
% !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}
Responder2
Com expl3 é realmente fácil (embora devido à extrema generalidade das funções relevantes, o desempenho possa não ser ideal):
%! 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}
Só para demonstrar aqui eu uso 2 caracteres Unicode irrelevantes.
O desempenho pode ser um pouco otimizado pré-compilando o regex:
\regex_new:N \l_ysalmon_regex
\regex_set:Nn \l_ysalmon_regex {(\cA\~|\cS\ )+}
\newunicodechar{≡}{123\peek_regex_remove_once:NT\l_ysalmon_regex{}}
(variável nomeada de acordo com o nome de usuário do OP. Altere se necessário)
A peek
família de funções não lida corretamente com alguns casos extremos, mas é tão raro que é praticamente impossível de surgir na prática.
Responder3
É mais fácil remover toda a cola, sulcos e penalidades antes de uma guilhotina de fechamento do que remover o que está depois de uma guilhotina de abertura.
De qualquer forma, isso deve ser bastante eficiente.
\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}
Responder4
Gostaria de mencionar que o babel-french v3.5o corrige o problema (apenas para o mecanismo LuaTeX): codificar «bla»
ou « bla »
ou «~bla~»
produz a mesma saída.
\documentclass{article}
\usepackage{fontspec}
\usepackage[french]{babel}
\frenchsetup{og=«, fg=»}
\begin{document}
«bla» « bla » «~bla~» \frquote{bla}
\end{document}
estampas