删除 \Set 命令在花括号周围放置的空格

删除 \Set 命令在花括号周围放置的空格

命令\Set(来自braket包裹) 对于集合构建器符号很有用,但它会在括号前后添加空格。

比较\Set{1, 2, 3}

<code>\设置{1, 2, 3}

\{1, 2, 3\}

<code>\{1, 2, 3\}

查看源代码,\Set似乎\,在每个花括号前后都添加了空格。如何暂时将这些空格设为零宽度?我想重新定义\set为只\Set删除空格,但似乎都没有用 定义\newcommand

我尝试过类似的东西,但它得到了某种 TeX“堆栈溢出” ( ! TeX capacity exceeded, sorry [input stack size=5000].)。

\renewcommand{\set}[1]{%
    \let \lbrace = \{\!%
    \let \rbrace = \!\}%
%
    \Set{#1}%
%
    \let \lbrace = \{%
    \let \rbrace = \}%
}

即使我让重新定义的命令起作用,我的方法也不会考虑其他空间。这是一个最小的工作示例:

\documentclass[12pt]{article}

\usepackage{braket}

\begin{document}
    \noindent Compare \[
        \Set{1, 2, 3}
    \]
%
    To \[
        \{1, 2, 3\}
    \]
\end{document}

答案1

如下所示,空格是\:这样的,您可以通过将命令重新定义为来否定它

\renewcommand\Set[1]{%
    \csname Set \endcsname{\mskip-\medmuskip#1\mskip-\medmuskip}}

\documentclass[12pt]{article}

\usepackage{braket}

\begin{document}
    \noindent Compare \[
        \Set{1, 2, 3}
    \]
   \noindent Compare \[\let\:\relax
        \Set{1, 2, 3}
    \]
%
    To \[
        \{1, 2, 3\}
    \]
\end{document}

在此处输入图片描述

答案2

的定义\Set包括\medmuskip \:围绕其论点(来自braket.sty):

  \expandafter\gdef\csname Set \endcsname#1{\left\{%
     \ifx\SavedDoubleVert\relax \let\SavedDoubleVert\|\fi
     \:{\let\|\SetDoubleVert
     \mathcode`\|32768\let|\SetVert
     #1}\:\right\}}

\:注意after\left\{和 before的用法\right\}。你可以使用另一个\SET宏重新定义删除它:

在此处输入图片描述

\documentclass[12pt]{article}
\usepackage{braket}

\newcommand{\SET}[1]{\Set{\mskip-\medmuskip #1 \mskip-\medmuskip}}

\begin{document}

\begin{tabular}{rl}
  \texttt{\detokenize{\Set}}: & $\Set{1, 2, 3}$ \\
  \texttt{\{1, 2, 3\}}: & $\{1, 2, 3\}$ \\
  \texttt{\detokenize{\SET}}: & $\SET{1, 2, 3}$ \\
\end{tabular}
\end{document}

或者,\Set通过包含以下内容来重新定义以满足您的需求您加载braket

{\catcode`\|=\active
  \xdef\set{\protect\expandafter\noexpand\csname set \endcsname}
  \expandafter\gdef\csname set \endcsname#1{\mathinner
        {\lbrace\,{\mathcode`\|32768\let|\midvert #1}\,\rbrace}}
  \xdef\Set{\protect\expandafter\noexpand\csname Set \endcsname}
  \expandafter\gdef\csname Set \endcsname#1{\left\{%
     \ifx\SavedDoubleVert\relax \let\SavedDoubleVert\|\fi
     {\let\|\SetDoubleVert
     \mathcode`\|32768\let|\SetVert
     #1}\right\}}
}

答案3

出于奇怪的原因,braket使用,其中\:就足够了。\Set\,

我建议用 * 变体重新定义命令,以抑制括号旁边的空格(以及\,“大”形式)。

\documentclass{article}
\usepackage{braket,xparse}

\begingroup
\catcode`\|=\active
\gdef\changebarto#1{\mathcode`\|="8000 \let|#1}
\endgroup

\RenewDocumentCommand{\set}{sm}{%
  \mathinner{%
    \lbrace
    \IfBooleanF{#1}{\,}%
    {\changebarto\midvert #2}%
    \IfBooleanF{#1}{\,}%
    \rbrace
  }%
}
\RenewDocumentCommand{\Set}{sm}{%
  \left\lbrace
    \ifx\SavedDoubleVert\relax \let\SavedDoubleVert\|\fi
    \IfBooleanF{#1}{\,}%
    {\let\|\SetDoubleVert\changebarto\SetVert #2}%
    \IfBooleanF{#1}{\,}%
  \right\rbrace
}

\begin{document}
$\set{1,2,3}\ne\set*{1,2,3}$

$\set{x|x\notin x}$

$\displaystyle\Set{x|x\ne\frac{1}{2}}$

$\displaystyle\Set*{x|x\ne\frac{1}{2}}$
\end{document}

在此处输入图片描述

相关内容