排版商和双商

排版商和双商

排版数学商和双商的最佳方法是什么?

我指的是像X/~(~ X 上的等价关系) 和G\X/H(其中 G 和 H 是作用于 X 的群) 这样的构造。虽然简单情况可以通过类似X/\mathord\sim(或者可能用\mathbin/) 的东西来解决,但在更复杂的情况下以及双商的情况下,读者很难解析。另一种方法是倾斜\sfrac{X}{\mathord\sim}(来自xfrac),但这会使 X 相当小,并且不适用于双商。

您有更好的想法吗?

答案1

问题在于 TeX 的间距表缺少 和 类/\它们是二元运算符,前后没有任何间距。由于无法添加 , 之类的间距类\mathrel\mathbin我希望有一天 LuaTeX 可以实现),因此这个问题没有完美的解决方案。

模拟此间距类的一种方法是使用\mathclose{}/\mathopen{},但这不适用于\big\middle等。为了解决这个问题,您需要使用 TeX 原语\delimiter(LaTeX 等效项\DeclareMathDelimiter在这里不行,因为它不允许在其后添加代码)。对于斜线,它是\delimiter"502F30E"表示它是一个十六进制数,表示5它是 类型\mathclose02F表示分隔符的不可扩展变体位于2F数学字体编号中0(这是operators用于 等的字体\sin),30E分隔符的可扩展版本位于0E数学字体编号中3(这是包含可扩展符号的字体)。因此,通过使用\delimiter"502F30E\mathopen{},我们将得到具有正确间距并且可以与 、 等很好地配合的\left东西\right

现在有两个选择:要么定义一个包含此定义的宏(这是 的自然解决方案\backslash),要么只需键入/即可获得正确的间距。对于第一个解决方案,您可以使用任何宏,但如果您想在文本模式下使用\slash并保留 的原始定义\slash,您可以使用类似这样的宏:

\documentclass{article}

\makeatletter
\newcommand*{\@old@slash}{}\let\@old@slash\slash
\def\slash{\relax\ifmmode\delimiter"502F30E\mathopen{}\else\@old@slash\fi}
\makeatother

\def\backslash{\delimiter"526E30F\mathopen{}}

\begin{document}

$E\slash\sim$ $\left.E\middle\slash\sim\right.$

$H\backslash G\slash K$ $\left.H\middle\backslash G\middle\slash K\right.$

\end{document}

如果您更喜欢第二种解决方案,则必须/在数学模式下启用 active (在文本模式下,它将保持正常)。如果您希望它与 babel 包配合使用,这会有点棘手,因为 babel 包也会处理 active 字符。以下内容改编自匈牙利语 babel 模块其阶乘为:

\documentclass{article}

\makeatletter %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% Define \addto if it doesn't exists

\@ifundefined{addto}{\def\addto#1#2{%
  \ifx#1\@undefined
    \def#1{#2}%
  \else
    \ifx#1\relax
      \def#1{#2}%
    \else
      {\toks@\expandafter{#1#2}%
        \xdef#1{\the\toks@}}%
    \fi
  \fi
}}{}

% Command to add commands "at every math formula" which
% takes into account the package nath.
% Adapted from:
%   http://www.math.bme.hu/latex/magyar_pre_tug2004.pdf#page=28

\def\addto@every@math{%
  \expandafter\addto\csname \expandafter\ifx
  \csname mathoptions@on\endcsname\relax % detect nath.sty
  check@mathfonts\else mathoptions@on\fi\endcsname
}

% Command to define a single character even when it is not active
% with a lowercase trick

\def\active@def#1{%
  \begingroup\lccode`\~=`#1\relax\lowercase{\endgroup\def~}%
}

% Command to change the definition of #1 into #2 ; beware of cyclic
% behaviours when using this to redefine characters like !, :, or ;
% Adapted from:
%   http://www.math.bme.hu/latex/magyar_pre_tug2004.pdf#page=28

\def\fixmathspacing#1#2{%
  \addto@every@math{%
    \catcode`#1=12 \mathcode`#1="8000
    \active@def#1{#2}%
  }%
}

\makeatother %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\fixmathspacing{/}{\mathclose{}\mathchar"013D\mathopen{}}

\def\backslash{\delimiter"526E30F\mathopen{}}

\begin{document}

$E/\sim$ $\left.E\middle/\sim\right.$

$H\backslash G/ K$ $\left.H\middle\backslash G\middle/ K\right.$

\end{document}

该宏\fixmathspacing应该可以与您想要的任何数学字符(分号等)一起使用,但要注意代码注释中提到的循环重新定义(使用\delimiter\mathchar都是安全的)。

最后一件事:如果您想指定斜杠或反斜杠的高度, nor\big\bigm不会产生正确的间距(与 不同\middle),因此您可能还应该定义一个新的\big变体,例如\bignn代表no space):

替代文本

\documentclass{article}
\makeatletter
\def\bign#1{\mathclose{\hbox{$\left#1\vbox to8.5\p@{}\right.\n@space$}}\mathopen{}}
\def\Bign#1{\mathclose{\hbox{$\left#1\vbox to11.5\p@{}\right.\n@space$}}\mathopen{}}
\def\biggn#1{\mathclose{\hbox{$\left#1\vbox to14.5\p@{}\right.\n@space$}}\mathopen{}}
\def\Biggn#1{\mathclose{\hbox{$\left#1\vbox to17.5\p@{}\right.\n@space$}}\mathopen{}}
\makeatother
\begin{document}
\begin{center}\begin{tabular}{lccccl}
\verb"\big" & $E\big/\sim$ & $E\Big/\sim$ & $E\bigg/\sim$ & $E\Bigg/\sim$ & too much space after \\
\verb"\bigm" & $E\bigm/\sim$ & $E\Bigm/\sim$ & $E\biggm/\sim$ & $E\Biggm/\sim$& too much space before \\
\verb"\bign" & $E\bign/\sim$ & $E\Bign/\sim$ & $E\biggn/\sim$ & $E\Biggn/\sim$ & correct spacing \\
\end{tabular}\end{center}
\end{document}

答案2

写波浪号最简单的方法是将其括\sim在括号中(因此商集表示为X/{\sim})。这可防止 TeX 将其视为\sim二元运算符,因此波浪号的间距正确。

来源:http://pbelmans.wordpress.com/2010/11/16/caveat-correct-spacing-in-quotient/

相关内容