尝试使用奇怪分隔符的宏定义(例如参见这或者这个问题),我认为有一个宏可以接受“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 非常正确地缺少它。