我的文檔有一個名為的自訂宏
\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}