如何将空格作为命令参数分隔符?
\documentclass{article}
\newcommand\foo[2]{#1 and #2.}
\begin{document}
\foo hi you
\end{document}
预期输出为
嗨,你。
当然,我不想用花括号把参数括起来。
以下内容不是我想要的。
\documentclass{article}
\def\foo #1 #2 {#1 and #2.}
\begin{document}
\foo hi you
\end{document}
答案1
您无法使用 来执行此操作\newcommand
。但可以使用\def
:
\def\foo #1 #2 {#1 and #2. }
现在\foo x y Something
将给出预期的结果。但是,在以下情况下,这将失效:
\foo me you
Something after a blank line
因为后面没有空格you
(当它们转换为 时,只有当行尾后面没有另一个行尾时,行尾才会算作空格\par
)。
您可以在 TeXbook 或 TeX by Topic 中查找“分隔参数”。
答案2
您必须使用\def
如下方式处理输入:
\def\foo#1 #2 {#1 and #2}
注意 #1 和 #2 之间以及之后的额外空格。这意味着您还可以写:
\foo{hi you} {you too}
但是这不是编写命令的好方法。
如果编写者错过了最后一个空格怎么办?LaTeX
然后会搜索直到找到一个空格...但是如果你定义:
\def\foo#1 #2{#1 and #2}
如果 #2 之后没有空格,您会发现第二个标记参数只会是第一个标记(在您的情况下y
,不是ou
)。
更好的解决方案是用标点符号或其他符号来指定命令的结束。
\def\foo#1 #2.{#1 and #2}
这被称为\foo hi you.
。这样你就不需要在最后一个参数周围使用括号结构了。
答案3
这应该能满足您的要求。它要求您在“me”和“you”之间输入一个(且只能输入一个)空格,并且第二个参数(“you”)后面必须跟一个换行符或一定数量的空格。您可以扩展测试,这样\more
当看到空格、非字母、非其他或标记时,它就会停止拾取标记\par
;现在,它会拾取所有内容,直到看到空格或\par
第二个参数之后。我从 TexBook 的附录 D(“Dirty Tricks”)中抄袭了\begingroup\lccode
=* \lowercase{\endgroup\let\sp= }
部分,他在那里展示了如何创建“有趣的”空格。
\documentclass{article}
\begingroup\lccode` =`* \lowercase{\endgroup\let\sp= }
\newtoks\after
\def\foo#1 #2{%%
\def\test{\afterassignment\more\let\next= }%%
\def\more{\after={\next}\ifx\next\sp%%
\else%%
\ifx\next\par%%
\else\after={\next\test}%%
\fi%%
\fi\the\after}%%
#1 and #2\test%%
}
\begin{document}
\foo hi you
\foo hi you!
\foo hi you \foo hi you
\foo hi you hello.
\end{document}