通过 \ooalign 覆盖符号

通过 \ooalign 覆盖符号

我想将一个数学符号叠加在另一个数学符号上——不是叠加,而是真正地重叠。用老式打字机的语言来说(!):输入一个字符,向后移动一个字符,然后在同一位置重新输入另一个字符。以下

\subseteq + \circ 作为单个符号(“开子集”)

我想出了以下最小工作示例:

\documentclass{amsart}
\begin{document}
$
\mathrel{\ooalign{\hss\circ\hss\cr\times}}
$
\end{document}

符号按我想要的方式叠加,但我也收到重复的错误消息

Missing $ inserted.

我很困惑...非常感谢您的帮助和评论!

(注意:上面的例子只是为了展示我想要做的事情;我知道我可以通过其他方式获得这个特定的符号组合)

答案1

\ooalign\halign是基于\hbox让你退出数学模式,这样你就可以使用

\documentclass{amsart}
\begin{document}
$
\mathrel{\ooalign{\hss$\circ$\hss\cr$\times$}}
$
\end{document}

尽管通常你会使用\mathchoice构造来适应上标等。

在此处输入图片描述

\documentclass{amsart}

\newcommand\zza{\mathrel{\ooalign{\hss$\circ$\hss\cr$\times$}}}

\newcommand\zzb{\mathrel{\mathpalette\zzbb{}}}
\newcommand\zzbb[1]{\ooalign{\hss$#1\circ$\hss\cr$#1\times$}}

\begin{document}
$
1 \zza -2 +  x^{1 \zza 2}
$

$
3 \zzb -4 + x^{3 \zzb 4}
$
\end{document}

答案2

如果你查看链接答案中的代码,你会看到它\subseteq被符号包围$

\newcommand{\opncls}[2]{%
  \ooalign{$#1\subseteq$\cr
  \hidewidth\raisefix{#1}\hbox{$#1#2\mkern.5mu$}\cr}}

这些是必要的,因为的内容\ooalign是在文本模式下排版的。

您的符号可能应该是\mathbin,因为它由两个二进制运算符号组成(链接答案的符号而是二元关系)。

此外,该答案跳过了将来某一天我会提到的一些更细节的方面。

因此你应该这样做

\makeatletter
\newcommand{\circtimes}{\mathbin{\vphantom{\times}\mathpalette\circtimes@\relax}}
\newcommand{\circtimes@}[2]{%
  \ooalign{$\m@th#1\times$\cr\hidewidth$\m@th#1\circ$\hidewidth\cr}%
}
\makeatother

完整示例:

\documentclass{article}
\usepackage{amsmath} % not really required for this example

\makeatletter
\newcommand{\circtimes}{\mathbin{\vphantom{\times}\mathpalette\circtimes@\relax}}
\newcommand{\circtimes@}[2]{%
  \ooalign{$\m@th#1\times$\cr\hidewidth$\m@th#1\circ$\hidewidth\cr}%
}
\makeatother

\begin{document}

\begin{gather*}
A \circtimes B^{\circtimes} \\
A \times B^{times} % for comparison
\end{gather*}

\end{document}

在此处输入图片描述

  1. \vphantom{\times}对于获取正确的边界框是必要的。
  2. \m@th有必要抵消参数可能出现的正值\mathsurround

相关内容