首先,最小工作样本如下。
\documentclass{amsart}
%\delimitershortfall=10pt
\delimiterfactor=000
\begin{document}
\[
S=\left\{x~
\begin{array}{|l}
\frac{m}{n}
\end{array}
\right\}
\]
\end{document}
如你所见,我通过设置\delimiterfactor
。但是数组环境中的垂直线仍然很长。那么如何全局减少数组环境中垂直线的长度呢?
\middle|
使用生成较长的“这样”行后,问题消失(年代是一组X使得...)如下。
\documentclass{amsart}
%\delimitershortfall=10pt
\delimiterfactor=000
\begin{document}
\[
S=\left\{x~\middle|
\begin{array}{l}
\frac{m}{n}
\end{array}
\right\}
\]
\end{document}
答案1
您应该使用 either array
nor \middle
。也许是\big
大小,但这取决于内容。
\documentclass{amsart}
\begin{document}
\[
S=\{x \mid \tfrac{m}{n} \}
\]
\[
S=\bigl\{x \bigm| \tfrac{m}{n} \bigl\}
\]
\end{document}
当然,对于集合构建器符号,人们可以做得更好。
\documentclass{amsart}
\NewDocumentCommand{\set}{s o >{\SplitArgument{1}{|}}m}{%
% first we absorb the arguments and pass control to \makeset
\IfBooleanTF{#1}{%
\makeset{\left\{}{\right\}}{\;\middle|\;}#3%
}{%
\makeset
{\mathopen{\IfValueT{#2}{#2}\{}}% opening
{\mathclose{\IfValueT{#2}{#2}\}}}% closing
{\mathrel{\IfValueT{#2}{#2}|}}% middle
#3%
}%
}
\NewDocumentCommand{\makeset}{mmmmm}{%
#1% opening
#4\IfValueT{#5}{#3#5}%
#2%
}
\begin{document}
\begin{gather*}
S=\set{x | \tfrac{m}{n}}
\\
S=\set[\big]{x | \tfrac{m}{n}}
\\
S=\set*{x | \frac{m}{n}}
\\
S=\set{x_1,x_2,\dots,x_n}
\end{gather*}
\end{document}
优点:你不必拘泥于特定的表示形式。例如,如果你想在有横线时在两端添加细空格(Knuth 就是这样做的),你可以通过修改来实现\makeset
:
\NewDocumentCommand{\makeset}{mmmmm}{%
#1% opening
\IfValueT{#5}{\,}%
#4\IfValueT{#5}{#3#5\,}%
#2%
}