Erkennen, ob vor und nach dem Makro Leerzeichen vorhanden sind

Erkennen, ob vor und nach dem Makro Leerzeichen vorhanden sind

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

\unskipentfernt 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 \spaceund \@ifnextcharprü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}

Ergebnis

Vereinfachung

Das Beispiel lässt sich durch Verwendung des Pakets vereinfachen xspace, danke Barbara. Kann jedoch \xspacenicht 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. \xspaceIst aber für die Interpunktionserkennung in Ordnung. Daher kann das folgende Leerzeichen mit dem folgenden \romannumeralTrick 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}

verwandte Informationen