私の文書には、カスタムマクロがあります。
\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}