Ignorar espacios, incluido ~

Ignorar espacios, incluido ~

El título lo dice todo, ¿cómo puedo ignorar los espacios, como \ignorespaceslo hace, pero incluyendo un ~?

La razón por la que pregunto es que somos varios autores que escribimos un documento y tienen diferentes hábitos con respecto a escribir guillemets franceses en su código fuente (es decir «bla», « bla »y «~bla~»), y quiero unificar esto estableciendo a \newunicodechar{«}con la definición adecuada.

Para el guillemet de cierre, \unskipparece funcionar en todos los casos.

Respuesta1

Aquí hay una solución basada en LuaLaTeX. Define una función Lua que hace la mayor parte del trabajo, además de un par de macros de utilidad LaTeX que activan y desactivan la función Lua. Por "activar", me refiero a "asignar la función Lua a la devolución de llamada de LuaTeX process_input_buffer", para que pueda actuar como un preprocesador en el flujo de entrada.antesTeX inicia su procesamiento habitual.

ingrese la descripción de la imagen aquí

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

Respuesta2

Con expl3 es realmente fácil (aunque debido a la extrema generalidad de las funciones relevantes, el rendimiento puede no ser el 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ólo para demostrarlo aquí, uso 2 caracteres Unicode irrelevantes.

El rendimiento podría optimizarse un poco precompilando la expresión regular:

\regex_new:N \l_ysalmon_regex
\regex_set:Nn \l_ysalmon_regex {(\cA\~|\cS\ )+}
\newunicodechar{≡}{123\peek_regex_remove_once:NT\l_ysalmon_regex{}}

(variable nombrada según el nombre de usuario del OP. Cambie si es necesario)

La peekfamilia de funciones no maneja correctamente algunos casos extremos, pero es tan raro que es prácticamente imposible solucionarlo en la práctica.

Respuesta3

Es más fácil quitar todo el pegamento, los granos y las penalizaciones antes de un guillemet de cierre que quitar lo que hay después de uno de apertura.

De todos modos, esto debería 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}

ingrese la descripción de la imagen aquí

Respuesta4

Me gustaría mencionar que babel-french v3.5o soluciona el problema (solo para el motor LuaTeX): la codificación «bla»o produce el mismo resultado « bla ».«~bla~»

\documentclass{article}
\usepackage{fontspec}
\usepackage[french]{babel}
\frenchsetup{og=«, fg=»}
\begin{document}
«bla»  « bla »  «~bla~» \frquote{bla}
\end{document}

huellas dactilares

ingrese la descripción de la imagen aquí

información relacionada