文本模式下的数学符号

文本模式下的数学符号

我需要编写包含一些数学符号的文本。具体来说,这些符号包括\rightarrow\forall\exists。我知道我可以使用符号切换到数学模式$,但我有相当多的文本,我不想像数学模式的默认斜体那样将它们显示为斜体。

我只是好奇什么是正确的做法。我是否应该为每个符号切换到数学模式并尝试使数学模式“非斜体”,或者是否有更好的方法,例如使用\textalphatextgreek 包中的希腊符号等?

以下是我的文本中的一行示例:

(S.Sname, B.Bname): ∀S ∃A ∃B (S.AId = A.AId \& B.BId = A.BId \& S.Sduration > 300)

答案1

您可以使用这个定义 的小代码片段\textify。控制序列\textify采用另一个控制序列(例如\exists)并将其包装到 中\ensuremath{…}

我认为人们不需要为了简单的事情\GlobalLetLtxMacro而经历所有的麻烦,这只是一个,但这应该涵盖所有奇怪的边缘情况。\protected\gdef\exists\mathchar

注意:\macroin\textify\macro可能不接受任何强制参数。可选参数将输出为其默认值。如果您要文本化的宏需要任何参数,则需要更复杂的方法。

\documentclass{article}
\usepackage{letltxmacro}
\newcommand\textify[1]{%
  \expandafter\GlobalLetLtxMacro\csname textify@\string#1\endcsname#1%
  \protected\gdef#1{\ensuremath{\csname textify@\string#1\endcsname}}%
}

\textify\exists
\textify\forall
\begin{document}
\exists $\exists$

\forall $\forall$
\end{document}

在此处输入图片描述

作为参考,不受letltxmacro保护的版本\textify如下:

\newcommand\textify[1]{%
  \global\expandafter\let\csname textify@\string#1\endcsname#1%
  \gdef#1{\ensuremath{\csname textify@\string#1\endcsname}}%
}

当然这不需要letltxmacro包。

答案2

使用 重新定义每个符号,\ensuremath使它们始终使用数学模式。为避免无限\ensuremath{\ensuremath{\ensuremath...循环,请使用 保存旧命令,以便\let在新定义中使用它。

例如,重新定义\to(它与 是相同的符号\rightarrow):

\let\OLDto\to
\renewcommand{\to}{\ensuremath{\OLDto}}

现在您可以在文本模式下使用\to!阅读更多这里\to\。如果希望下面的空间不被占用,请写下来。

相关内容