Detecte se há espaço antes e depois da macro

Detecte se há espaço antes e depois da macro

Meu documento tem uma macro personalizada chamada

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

Porém, quero ter certeza de que no documento sempre terei um único espaço antes e depois da macro.

Gostaria

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

aparecer como

Este [9] é um teste [10].

nãocomo

Este[9]é um[10] teste.

Como eu faria isso com uma macro?

Responder1

\unskipremove o espaço anterior. Dependendo do modo, este é um espaço horizontal ou vertical. Espaços após o comando podem ser ignorados por \ignorespaces. Um token de espaço pode ser definido \spacee \@ifnextchartestado para os tokens seguintes para evitar a configuração de espaço, se um caractere de pontuação vier em seguida. Como efeito colateral, também remove os espaços seguintes.

Exemplo 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

Simplificação

O exemplo pode ser simplificado usando package xspace, obrigado Bárbara. Entretanto, \xspacenão pode ser usado diretamente, pois se destina a macros sem argumentos. Então, a varredura do nome da macro engoliria o próximo espaço. Mas \xspaceé bom para detecção de pontuação. Assim, o espaço a seguir pode ser engolido pelo seguinte \romannumeraltruque, onde o espaço é consumido pela constante do caractere e o número negativo resultante é então removido por \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}

informação relacionada