偵測巨集前後是否有空格

偵測巨集前後是否有空格

我的文檔有一個名為的自訂宏

\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,謝謝 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}

相關內容