有没有办法定义一个不以 ? 开头的宏\
?例如,我希望将->
其扩展为,\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 猎犬同伴指出这些错误......)