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

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

我正在尝试创建\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}

结果

相关内容