![\subseteq + \circ 作为单个符号(“开子集”)](https://linux22.com/image/238529/%5Csubseteq%20%2B%20%5Ccirc%20%E4%BD%9C%E4%B8%BA%E5%8D%95%E4%B8%AA%E7%AC%A6%E5%8F%B7%EF%BC%88%E2%80%9C%E5%BC%80%E5%AD%90%E9%9B%86%E2%80%9D%EF%BC%89.png)
我正在尝试创建\opn
“开子集”和\cls
“闭子集”的符号。我希望它们看起来像这样:
我当前的解决方案是:
\def\opn{\!\ensuremath{\subseteq\!\!\!\!\!\raisebox{1pt}{$\circ$}}\,}
\def\cls{\!\ensuremath{\subseteq\!\!\!\!\!\raisebox{1pt}{$\bullet$}}\,}
但是问题是当我使用它时,Latex 不会将\subseteq
和\circ
视为单个符号,因此当我例如写时间距不正确$U~\!\!\!\opn\!\!\!~X$
:
我怎样才能圆圈的位置固定在中间,这样就\opn
变成了一个可调整大小的单一符号,也就是说,可以很好地响应\huge
?
编辑:@egreg @MartinScharrer: 当使用你的命令(定义捆的茎)时
\mathcal{F}_x:=\frac{\bigsqcup\{\mathcal{F}(U);\, x\in U \opn X\}}{s\sim s'
\,\Longleftrightarrow\, s\in\mathcal{F}(U)\text{ and }s'\in\mathcal{F}(U')\text{ and }
\exists x\in W \opn U\cap U'\!:s|_W=s'|_W}
我得到了丑陋的结果,即(egreg 的解决方案)
和(Martin Scharrer 的解决方案)
。
目前,我最喜欢这个经过编辑的 Martin 的解决方案:
\def\opn{ \ensuremath{\mathrel{\subseteq \!\!\!\!\!\raisebox{1.63pt}{$\scriptstyle\circ$}}}} %odprta podmnozica
\def\opnn{\ensuremath{\mathrel{\subsetneq\!\!\!\!\!\raisebox{1.63pt}{$\scriptstyle\circ$}}}} %prava odprta podmnozica
\def\cls{ \ensuremath{\mathrel{\subseteq \!\!\!\!\!\raisebox{1.63pt}{$\scriptstyle\bullet$}}}} %zaprta podmnozica
\def\clsn{\ensuremath{\mathrel{\subsetneq\!\!\!\!\!\raisebox{1.63pt}{$\scriptstyle\bullet$}}}} %prava zaprta podmnozica
但上面的代码仍然存在问题。有人可以编辑这个吗最后代码解决间距问题?
答案1
有以下可能性:
\newcommand\opn{\mathrel{\ooalign{$\subseteq$\cr
\hidewidth\raise.225ex\hbox{$\circ\mkern.5mu$}\cr}}}
\newcommand\cls{\mathrel{\ooalign{$\subseteq$\cr
\hidewidth\raise.225ex\hbox{$\bullet\mkern.5mu$}\cr}}}
符号会根据上下文改变大小。它们不会减少下标或上标,因为需要更多的东西。
这是一个\ensuremath
多余的情况,因为符号总是会在数学模式中使用,除了在它们的定义中,在$
它们周围添加符号并不麻烦。
低级\ooalign
命令是我最喜欢的工具之一。我告诉 TeX 将两个符号叠加在一起,圆圈或项目符号在右侧对齐,但向左推一点,\mkern.5mu
并以字体相关的尺寸凸起(0.225ex 的数量是通过反复试验计算出来的)。\mkern.5mu
如果您想将圆圈向左推一点,请执行此操作。
这是结果$A\opn B\cls C$
快速课程\ooalign
觉得\ooalign{...}
很像
\begin{tabular}[t]{@{}l@{}}
...
\end{tabular}
其中,\\
必须写成\cr
,但是所有行都打印在一起。通常使用\hidewidth
而不是\hfil
来使条目相对于最宽的条目居中,实际上它有其好处。
我们来看一个例子plain.tex
(LaTeX 的定义类似,这个被简化了):我们想在一些非标准字符后面加上一个变音符。
\def\c#1{{\ooalign{#1\cr\hidewidth\char24\hidewidth\cr}}}
这\char24
是通常的 Knuth 字体编码中的变音符;它是一个位于基线正下方的字符,因此对于没有降部字符的字符,我们可以打印字符 ( #1
) 并将变音符叠加在其上(当然,它会位于其下方)。\hidewidth\char24\hidewidth
我们假设变音符不占用水平空间,因此生成的块将与字符的宽度相同;我们甚至不需要知道 的宽度\char24
。
如果我们想构建一个“supinf”符号,将\land
和叠加\lor
,我们可以定义
\newcommand{\supinf}{\mathbin{\ooalign{$\lor$\cr$\land$\cr}}}
这里\mathbin
说该命令必须在数学模式下使用,并且该符号被视为运算符号。
该命令\hidewidth
仅添加了一个大的负空间(它用\hskip -1000pt plus 1fill
无限的可拉伸性来补偿它。存在的表格单元格\hidewidth
永远不会是最大的单元格。
警告
始终将其括{\ooalign{...}}
在组中,如这里所示,并在 的定义中,否则令人不快的意外可能会破坏您的排版杰作。在我们的例子中,和\c
中的括号充当组分隔符。\mathbin{...}
\mathrel{...}
以下是如何根据数学样式改变尺寸的方法:
\documentclass{article}
\usepackage{amsmath}
\makeatletter
\newcommand\opn{\mathrel{\opncls@{\circ}}}
\newcommand\cls{\mathrel{\opncls@{\bullet}}}
\newcommand{\opncls@}[1]{%
\vphantom{\subseteq}% to fix the bounding box
\mathpalette\opncls@@{#1}%
}
\newcommand{\opncls@@}[2]{%
\ooalign{$\m@th#1\subseteq$\cr
\hidewidth\opncls@fix{#1}\hbox{$\m@th#1#2\mkern.5mu$}\cr}}
\newcommand\opncls@fix[1]{%
\ifx#1\displaystyle
\raise.225ex
\else
\ifx#1\textstyle
\raise.225ex
\else
\ifx#1\scriptstyle
\raise.180ex
\else
\raise.150ex
\fi
\fi
\fi
}
\makeatother
\begin{document}
$
\mathcal{F}_x:=
\frac{\bigsqcup\{\mathcal{F}(U);\, x\in U \opn X\}}
{\exists x\in W \opn U\cap U'\!:s|_W=s'|_W}
$
\bigskip
$\displaystyle\opn\cls
\quad
\textstyle\opn\cls
\quad
\scriptstyle\opn\cls
\quad
\scriptscriptstyle\opn\cls$
\end{document}
(我简化了您的公式只是为了展示新符号的效果;但是,这么大的公式应该始终以显示样式和 进行排版\dfrac
。)
还有一些注意事项。我使用这个是\m@th
为了避免文档类设置非零值时出现问题\mathsurround
(但很少设置成其他值)。
这\vphantom{\subseteq}
是必要的,因为\ooalign
使用第一行表示高度、最后一行表示深度来设置边界框。
答案2
强制性的 Unicode 答案:使用带有软件包的 XeLaTeX 或 LuaLaTeX unicode-math
,您可以⟃
直接使用 (即 U+27C3 OPEN SUBSET)(或使用别名\subsetcirc
)。还有⪽
(U+2ABD SUBSET WITH DOT; \subsetdot
) 和⫏
(U+2ACF CLOSED SUBSET; \csub
)。Unicode 似乎不包含带有项目符号的子集符号。
答案3
您需要将符号放在里面,\mathrel{..}
这样它才会被视为关系符号。为了支持不同的大小,您应该\raisebox
使用ex
单位来定义。
\def\opn{\ensuremath{\mathrel{\subseteq\!\!\!\!\!\raisebox{1pt}{$\circ$}}}}
\def\cls{\ensuremath{\mathrel{\subseteq\!\!\!\!\!\raisebox{1pt}{$\bullet$}}}}
另请参阅类似问题用另一个符号覆盖符号。
答案4
以下示例使用 / 构造来自 / / / 的符号。\subset
构造\supset
的\subseteq
符号可以调整大小。\supseteq
\circ
\bullet
- 可以使用 配置圆圈/项目符号的水平位置
\subsetcircfills
。 - 并且可以使用 设置圆圈/项目符号的大小
\subsetcircscale
。然后代码还会尝试将侧边距考虑在内。
示例文件:
\documentclass{article}
% graphics or graphicx is needed, if the circ/bullet should be resized
\usepackage{graphicx}
\makeatletter
% Setup commands
% --------------
% \subsetcircfills{<fill factor/closed side>}{<fill factor/open side>}
% Configures the horizontal placement of the circ/bullet.
% Examples:
% \subsetcircfills{1}{0} -> circ/bullet is moved to the right/open side
% \subsetcircfills{5}{2} -> circ/bullet moved more to the middle
% It also configures the super set symbols.
\newcommand*{\subsetcircfills}[2]{%
\def\@subsetcircfill@close{#1}%
\def\@subsetcircfill@open{#2}%
}
% \subsetcircscale{<factor>}
% Resizes the circ/bullet.
% Examples:
% \subsetcircscale{1} -> original size
% \subsetcircscale{.8} -> circ/bullet is smaller by a fifth
\newcommand*{\subsetcircscale}[1]{%
\def\@subsetcirc@scale{#1}%
}
% Symbols
% -------
\newcommand*{\subsetcirc}{\@subsetcirc@gen000}
\newcommand*{\subsetbullet}{\@subsetcirc@gen001}
\newcommand*{\supsetcirc}{\@subsetcirc@gen100}
\newcommand*{\supsetbullet}{\@subsetcirc@gen101}
\newcommand*{\subseteqcirc}{\@subsetcirc@gen010}
\newcommand*{\subseteqbullet}{\@subsetcirc@gen011}
\newcommand*{\supseteqcirc}{\@subsetcirc@gen110}
\newcommand*{\supseteqbullet}{\@subsetcirc@gen111}
% Help macros
% -----------
%
% \@subsetcirc@gen
% #1: 0: subset, 1: supset
% #2: 0: no equals, 1: equals
% #3: 0: circ, 1: bullet
\newcommand*{\@subsetcirc@gen}[3]{%
\mathrel{%
\mathpalette{\@subsetcirc@@gen{#1}{#2}{#3}}{}%
}%
}
% \@subsetcirc@@gen
% #1: 0: subset, 1: supset
% #2: 0: no equals, 1: equals
% #3: 0: circ, 1: bullet
% #4: math style
% #5: <empty>
\newcommand*{\@subsetcirc@@gen}[5]{%
\sbox0{$%
#4%
\m@th
\ifcase#1 %
\ifcase#2 %
\subset
\else
\subseteq
\fi
\else
\ifcase#2 %
\supset
\else
\supseteq
\fi
\fi
$}%
\sbox2{$#4\m@th\ifcase#3 \circ\else\bullet\fi$}%
\@subsetcirc@resize#4%
\ifcase#2 \else\@subsetcirc@eqcorr#4\fi
\rlap{\unhcopy0}%
\hbox to \wd0{%
\hskip 0pt plus %
\ifcase#1 \@subsetcircfill@close\else\@subsetcircfill@open\fi fil%
\relax
\unhbox2 %
\hskip 0pt plus %
\ifcase#1 \@subsetcircfill@open\else\@subsetcircfill@close\fi fil%
\relax
}%
}
% \@subsetcirc@resize{<math style>}
% Resizes the circ/bullet in box 2.
% It also tries to take care of the side bearings.
\newcommand*{\@subsetcirc@resize}[1]{%
\ifdim\@subsetcirc@scale pt=1pt %
\else
\sbox4{$#1\vcenter{}$}%
\sbox2{\raisebox{-\ht4}[\ht4][\ht4]{\unhcopy2}}%
\sbox2{$%
#1\m@th%
\vcenter{%
\hbox{%
\dimen6=.5\dimexpr\wd2 -2\ht2 + 2\ht4\relax
\kern\dimen6 %
\resizebox{!}{\@subsetcirc@scale\height}{%
\kern-\dimen6 %
\copy2 %
\kern-\dimen6 %
}%
\kern\dimen6 %
}%
}%
$}%
\fi
}
% \@subsetcirc@eqcorr{<math style>}
% Corrects the vertical position of circ/bullet in box 2 for
% the symbols with the "equals" line.
\newcommand*{\@subsetcirc@eqcorr}[1]{%
\sbox6{$#1\subset$}%
\sbox2{%
\raise\dimexpr\ht0-\ht6\relax\copy2 %
}%
}
\makeatother
% Symbol setup
\subsetcircfills{1}{0}
\subsetcircscale{.8}
\begin{document}
\[ X \subsetcirc Y \supsetcirc Z\,
{\scriptstyle X \subsetcirc Y \supsetcirc Z}\,
{\scriptscriptstyle X \subsetcirc Y \supsetcirc Z}
\]
\[ X \subsetbullet Y \supsetbullet Z\,
{\scriptstyle X \subsetbullet Y \supsetbullet Z}\,
{\scriptscriptstyle X \subsetbullet Y \supsetbullet Z}
\]
\[ X \subseteqcirc Y \supseteqcirc Z\,
{\scriptstyle X \subseteqcirc Y \supseteqcirc Z}\,
{\scriptscriptstyle X \subseteqcirc Y \supseteqcirc Z}
\]
\[ X \subseteqbullet Y \supseteqbullet Z\,
{\scriptstyle X \subseteqbullet Y \supseteqbullet Z}\,
{\scriptscriptstyle X \subseteqbullet Y \supseteqbullet Z}
\]
\end{document}
结果
\subsetcircfills{1}{0}
\subsetcircscale{.8}
结果
\subsetcircfills{5}{2}
\subsetcircscale{1}