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
\unskip
elimina 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 \space
y \@ifnextchar
probar 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}
Simplificación
El ejemplo se puede simplificar usando el paquete xspace
, gracias Barbara. Sin embargo, \xspace
no 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 \xspace
está bien para la detección de puntuación. Por lo tanto, el siguiente espacio puede ser devorado por el siguiente \romannumeral
truco, 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}