Ignore espaços, incluindo ~

Ignore espaços, incluindo ~

O título diz tudo, como posso ignorar espaços, como \ignorespacesacontece, 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, \unskipparece 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_bufferretorno de chamada do LuaTeX", para que ela possa atuar como um pré-processador no fluxo de entradaantesTeX inicia seu processamento normal.

insira a descrição da imagem aqui

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

insira a descrição da imagem aqui

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

insira a descrição da imagem aqui

informação relacionada