我想创建一个由两部分组成的间距命令。具体来说,我想要两个命令:\mySpaceOne
和\mySpaceTwo
。如果\mySpaceOne
后面跟着一个\mySpaceTwo
,那么它会产生一定量的空间;否则,它什么也不做,也不会消耗下一个标记。
这可能吗?如何开始创建这样的命令?
答案1
\makeatletter
\newcommand\mySpaceOne{\@ifnextchar\mySpaceTwo{\hspace{1em}}{}}
\makeatother
然而这将消耗掉所有空间标记。
答案2
与 egreg 的答案类似,但使用 TeX 原语\futurelet
\documentclass{article}
\begin{document}
\def\myspacetwo{}
\def\myspaceone{%
\futurelet\ifoptions
\choosemacro
}
\def\choiceone{\rule{20pt}{20pt}}
\def\choicetwo{}
\def\choosemacro{%
\ifx\ifoptions\myspacetwo%
\let\choice = \choiceone
\else
\let\choice = \choicetwo
\fi
\choice
}
\myspaceone\myspacetwo
\myspaceone
\end{document}
A\futurelet
通常需要三个标记:
\futurelet\tokena\tokenb\tokenc
TeX 执行生成一个以名称存储的let\tokena=\tokenc
副本。\tokenc
\tokena
然后它\tokena
从主标记列表中删除。接下来 TeX 会扩展\tokenb
。
从实际目的来看,此标记是具有以下属性的宏:
- 宏将使用
\tokena
( 的副本\tokenc
)来找出\tokenc
是什么,换句话说,稍后会预期什么标记。 - 然后它会导致另一个宏被扩展,并最终吸收
\tokenc
。