未转义的宏

未转义的宏

有没有办法定义一个不以 ? 开头的宏\?例如,我希望将->其扩展为,\rightarrow因为我喜欢阅读原始 LaTeX,而且 它读起来比或 甚至 (我现在拥有的解决方案)$\eps -> 0$好得多(对我来说) 。$\eps\rightarrow0$$\eps\goto0$

我想可以将其定义-为转义符,然后用它来读取下一个字符,如果是,则将>整个内容扩展为\rightarrow,如果不是,则将其扩展--,并让下一个字符成为它的东西...我不知道我刚才写的是否有意义,也不知道该怎么做,也不知道避免这种行为的可能陷阱和原因……

有啥想法?有什么评论?

答案1

您可以决定仅在数学模式下使-“活动”并提前查看>

\documentclass{article}
\mathchardef\minuschar=\mathcode`-\relax
\mathcode`-="8000\relax
\begingroup\makeatletter\lccode`~=`-\lowercase{\endgroup
  \def~{\@ifnextchar{>}{\rightarrow\@gobble}{\minuschar}}}
\begin{document}
We can try $-\int$, $-\sum$, $x->0$, $x- >0$ etc.
\end{document}

当 TeX 在数学模式下遇到 catcode 为 11 或 12(字母或其他)的字符时,它会查找该字符的数学代码。这是一个介于 和 之间的数字"0000"8000十六进制)。该值"8000被特殊处理为“改用相应的活动字符”。然后我定义-为向前查找>,并放置 a和\rightarrow,或者放置减号字符。\@gobble>

答案2

最简单的解决方案,正如其中一条评论中所观察到的,就是直接输入。当使用正确的unicode输入时,ConTeXt MkIV和LaTeX +都会给出正确的输出。unicode-math

如果你使用 LuaTeX,也可以解析输入并转换->。以下是使用translate模块的ConTeXt 中的一个例子

\usemodule[translate]

\translateinput[->][→]
\translateinput[=>][⇒]

\enableinputtranslation

\starttext
$x - y = 0 => x = y$
\stoptext    

答案3

有一个包专门提供这种服务,叫做语义。它是为排版编程语言语义而设计的,因此它提供了五件事:数学连字符推理规则(带水平线);T 图(用于表示编译器和解释器的组合);保留字的排版;以及默认简写。显然,我们关心的是粗体字的两位。

数学连字可让您精确地执行以下操作:

\documentclass{minimal}

\usepackage[ligature]{semantic}

\mathlig{->}{\rightarrow}

\begin{document}
  \[ a_{>} -> b_{-} \]
\end{document}

这将与书写排版完全相同\[ a_{>} \rightarrow b_{-} \]

您可以将连字符定义为任意字符序列(有关精确细节,检查文档),如果你指定[shorthand]包中的选项,它将定义一个默认集(同样,文档中有列表)。

至于限制,我只遇到过一个:b_-单独使用不起作用(无论它是否在数学模式的末尾),因为它-是连字符的首字符(例如,a_>可以正常工作)。我不知道这是为什么。我还猜想重新定义-为活动字符会中断,但我从未尝试过。老实说,我以前从未遇到过这种情况,但现在有人提到了类似的事情,我想我会检查一下。

答案4

当然,可以指定除\(反斜杠) 之外的字符作为 TeX 中控制字 (宏) 的开头。但是,您会得到什么呢?即使所有宏都以~(波浪号) 字符而不是开头\,也不会影响用于表示各种命令的字符串的长度,不是吗?

顺便说一句,\to是的同义词\rightarrow\to对你来说够短(且可读性够强)吗?:-)

有点冗长的附录为了将特定的字符组合->变成一个在数学模式下排版等同于的“命令” \to,你必须使第一个字符,-即 TeX 术语中的“活动”字符,然后定义一个读取下一个字符的宏;如果该字符是>,则你会告诉 TeX 排版\rightarrow,如果不是,则你会指示 TeX 将该-字符和后面的字符放回输入标记流中。

->现在,回到如何让“指令”执行指令的问题\rightarrow。研究下面 MWE 中的代码;\catcode命令使 处于-活动状态,下一行提供命令的定义。请注意,我们不能直接将其放回-标记流中,因为 TeX 会发现自己陷入越来越深的循环中,试图解决如何处理命令-。相反,我使用命令\char命令将破折号放回标记流中。

\documentclass{article}
\catcode`\-=\active
\def-#1{\ifx>#1 \ensuremath{\rightarrow} \else \char`-#1 \fi}

\begin{document}
-> \quad -+ \quad -, \quad $-a$ \quad 5--9 \quad $x->0$
\end{document}

在此处输入图片描述 (好吧,我确信我遗漏了一些可能导致该代码在某些情况下崩溃的情况;我会让我们的 TeX-SX 猎犬同伴指出这些错误......)

相关内容