Mein Dokument hat ein benutzerdefiniertes Makro namens
\newcommand{\myparenthetical}[1]{[#1]}
Ich möchte jedoch sicher sein, dass im Dokument vor und nach dem Makro immer ein einzelnes Leerzeichen steht.
Ich möchte
This\myparenthetical{9}is a\myparenthetical{10} test.
erscheinen als
Dies [9] ist ein [10] Test.
nichtals
Dies[9]ist ein[10] Test.
Wie würde ich dies mit einem Makro machen?
Antwort1
\unskip
entfernt vorheriges Leerzeichen. Je nach Modus ist dies horizontales oder vertikales Leerzeichen. Leerzeichen nach dem Befehl können mit ignoriert werden \ignorespaces
. Ein Leerzeichentoken kann mit gesetzt werden \space
und \@ifnextchar
prüft auf nachfolgende Token, um das Setzen von Leerzeichen zu vermeiden, wenn ein Satzzeichen folgt. Als Nebeneffekt werden auch nachfolgende Leerzeichen entfernt.
Vollständiges Beispiel:
\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}
Vereinfachung
Das Beispiel lässt sich durch Verwendung des Pakets vereinfachen xspace
, danke Barbara. Kann jedoch \xspace
nicht direkt verwendet werden, da es für Makros ohne Argumente gedacht ist. Dann würde die Suche nach dem Makronamen das nächste Leerzeichen verschlucken. \xspace
Ist aber für die Interpunktionserkennung in Ordnung. Daher kann das folgende Leerzeichen mit dem folgenden \romannumeral
Trick verschlungen werden, wobei das Leerzeichen von der Zeichenkonstante verbraucht wird und die resultierende negative Zahl dann durch entfernt wird \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}