命令\Set
(来自braket
包裹) 对于集合构建器符号很有用,但它会在括号前后添加空格。
比较\Set{1, 2, 3}
:
到\{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}