Определить, есть ли пробел до и после макроса

Определить, есть ли пробел до и после макроса

В моем документе есть пользовательский макрос, который называется

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

Однако я хочу быть уверен, что в документе всегда будет один пробел до и после макроса.

Я хотел бы

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

выглядеть как

Это [9] тест [10].

неткак

Это[9][10] тест.

Как это сделать с помощью макроса?

решение1

\unskipудаляет предыдущий пробел. В зависимости от режима это горизонтальный или вертикальный пробел. Пробелы после команды можно игнорировать с помощью \ignorespaces. Маркер пробела может быть установлен с помощью \spaceи \@ifnextcharпроверяет следующие маркеры, чтобы избежать установки пробела, если следует символ пунктуации. В качестве побочного эффекта он также удаляет следующие пробелы.

Полный пример:

\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}

Результат

Упрощение

Пример можно упростить, используя package xspace, спасибо, Барбара. Однако, \xspaceнельзя использовать напрямую, так как он предназначен для макросов без аргументов. Тогда сканирование имени макроса поглотит следующий пробел. Но \xspaceэто нормально для обнаружения знаков препинания. Таким образом, следующий пробел можно поглотить следующим \romannumeralтрюком, где пробел потребляется символьной константой, а полученное отрицательное число затем удаляется с помощью \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}

Связанный контент