マクロの前後にスペースがあるかどうかを検出する

マクロの前後にスペースがあるかどうかを検出する

私の文書には、カスタムマクロがあります。

\newcommand{\myparenthetical}[1]{[#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}

結果

簡素化

この例は、パッケージ を使用することで簡略化できますxspace。Barbara に感謝します。ただし、\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}

関連情報