Detectar si hay espacio antes y después de la macro

Detectar si hay espacio antes y después de la macro

Mi documento tiene una macro personalizada llamada

\newcommand{\myparenthetical}[1]{[#1]}

Sin embargo, quiero estar seguro de que en el documento siempre tenga un único espacio antes y después de la macro.

Me gustaría

This\myparenthetical{9}is a\myparenthetical{10} test.

aparecer como

Esta [9] es una prueba [10].

nocomo

Esta[9]es una[10] prueba.

¿Cómo haría esto con una macro?

Respuesta1

\unskipelimina el espacio anterior. Dependiendo del modo este es un espacio horizontal o vertical. Los espacios después del comando pueden ser ignorados por \ignorespaces. Se puede establecer un token de espacio \spacey \@ifnextcharprobar los siguientes tokens para evitar la configuración de espacios, si le sigue un carácter de puntuación. Como efecto secundario, también elimina los siguientes espacios.

Ejemplo completo:

\documentclass{article}

\makeatletter
\newcommand*{\myparenthetical}[1]{%
  \ifhmode
    \unskip
    \space
  \fi
  [#1]%
  \@ifnextchar{.}{}{%
  \@ifnextchar{,}{}{%
  \@ifnextchar{;}{}{%
  \@ifnextchar{!}{}{%
  \@ifnextchar{?}{}{%
  \@ifnextchar{)}{}{%
  \@ifnextchar\par{}{%
    \space
    \ignorespaces
  }}}}}}}%
}

\begin{document}
\myparenthetical{1} starts a sencents and ends it \myparenthetical{2}.
\myparenthetical{3}Lorem ipsum\myparenthetical{4} ,\myparenthetical{5}.

This\myparenthetical{6}is \myparenthetical{7} a\myparenthetical{8} test.
\end{document}

Resultado

Simplificación

El ejemplo se puede simplificar usando el paquete xspace, gracias Barbara. Sin embargo, \xspaceno se puede utilizar directamente porque está destinado a macros sin argumentos. Luego, la búsqueda del nombre de la macro se tragaría el siguiente espacio. Pero \xspaceestá bien para la detección de puntuación. Por lo tanto, el siguiente espacio puede ser devorado por el siguiente \romannumeraltruco, donde el espacio es consumido por la constante de caracteres y el número negativo resultante luego se elimina mediante \romannumeral:

\documentclass{article}

\usepackage{xspace}

\makeatletter
\newcommand*{\myparenthetical}[1]{%
  \ifhmode
    \unskip
    \space
  \fi
  [#1]%
  \expandafter\xspace\romannumeral-`\x
}

\begin{document}
\myparenthetical{1} starts a sencents and ends it \myparenthetical{2}.
\myparenthetical{3}Lorem ipsum\myparenthetical{4} ,\myparenthetical{5}.

This\myparenthetical{6}is \myparenthetical{7} a\myparenthetical{8} test.
\end{document}

información relacionada