В моем документе есть пользовательский макрос, который называется
\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}