是否可以使用 $ 作为宏分隔符?

是否可以使用 $ 作为宏分隔符?

尝试使用奇怪分隔符的宏定义(例如参见或者这个问题),我认为有一个宏可以接受“a/b”形式的参数并将其转换为分数,这会很有趣。

这是通过

\def\myfrac#1/#2 {\frac{#1}{#2}}

它将斜线之前的所有内容扫描到 中#1,并将斜线之后的所有内容扫描到 中,直到下一个空格为止#2。因此,

$\myfrac 72/31 $
$\myfrac 7/13 34\times\pi$

生产

编译代码

就像期望的那样。但——毫不奇怪——

$\myfrac 72/31$

给出**! Missing } inserted.**错误,因为——当然——缺少分隔空格。为了避免这个问题,我想定义

\def\myfrac#1${\@myfrac#1 }
\def\@myfrac#1/#2 {\frac{#1}{#2}}

即扫描所有内容直到下一个$,在末尾添加一个空格,然后将其传递给另一个宏。然而,这会导致! Missing $ inserted.

但请注意,它适用于“正常”分隔符:

\documentclass{minimal}

\makeatletter
\def\myfrac#1x{\@myfrac#1 }
\def\@myfrac#1/#2 {\frac{#1}{#2}}
\makeatother

\begin{document}
$\myfrac 72/31x$ $\myfrac 3/15 x$
$\myfrac 7/13 34\times\pi x$
\end{document}

生产

编译输出

正如预期的那样。那么有没有办法用 替换x上面的代码$

答案1

由于这只是为了实验,因此如下所示:

\documentclass{article}
\makeatletter
\def\myfrac#1${\@myfrac#1 $}
\def\@myfrac#1/#2 #3${\frac{#1}{#2}#3$}
\makeatother
\begin{document}
$\myfrac 72/31$ $\myfrac 3/15$ $\myfrac 7/13 34\times\pi$
\end{document}

在此处输入图片描述

“参数文本”从输入流中删除并替换为替换文本,因此$必须在末尾重新插入结束符。

$的替换文本中的\myfrac和的参数文本中的可以\@myfrac是任何不应出现在公式中的标记,因此也\@nil可以使用;但使用$同样安全。

不要在用户级别使用 LaTeX 中的分隔参数。

答案2

你的实际问题是,你正在与本周讨论的问题发生冲突\def 对间距敏感吗?。不要在后面加空格#2,这样就没问题了。你的第二个解决方法之所以有效,是因为你在 中明确插入了空格\@myfrac。你的第一个解决方法之所以有效,是因为没有工作是删除$宏扩展的一部分(它被吸收为参数的一部分)但不将其放回,因此 TeX 非常正确地缺少它。

相关内容