如何将空格作为命令参数分隔符?

如何将空格作为命令参数分隔符?

如何将空格作为命令参数分隔符?

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

相关内容