我需要编写包含一些数学符号的文本。具体来说,这些符号包括\rightarrow
、\forall
和\exists
。我知道我可以使用符号切换到数学模式$
,但我有相当多的文本,我不想像数学模式的默认斜体那样将它们显示为斜体。
我只是好奇什么是正确的做法。我是否应该为每个符号切换到数学模式并尝试使数学模式“非斜体”,或者是否有更好的方法,例如使用\textalpha
textgreek 包中的希腊符号等?
以下是我的文本中的一行示例:
(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
注意:\macro
in\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\
。如果希望下面的空间不被占用,请写下来。