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
\unskip
remove 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 \space
e \@ifnextchar
testado 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}
Simplificação
O exemplo pode ser simplificado usando package xspace
, obrigado Bárbara. Entretanto, \xspace
nã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 \romannumeral
truque, 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}