![命令定义中的自适应括号:如何避免奇数空格](https://linux22.com/image/474924/%E5%91%BD%E4%BB%A4%E5%AE%9A%E4%B9%89%E4%B8%AD%E7%9A%84%E8%87%AA%E9%80%82%E5%BA%94%E6%8B%AC%E5%8F%B7%EF%BC%9A%E5%A6%82%E4%BD%95%E9%81%BF%E5%85%8D%E5%A5%87%E6%95%B0%E7%A9%BA%E6%A0%BC.png)
我正在尝试改进带有自适应括号的命令,但我不知道如何避免运算符和第一个括号之间出现意外的空格。
我已经遇到了这个命令的问题这个问题,我想准确说明这个命令的作用。
此命令的目的是简化不同类型同态的输入过程,并可能推广到其他运算符。最初的想法是有一个命令\Hom[<subscript>]{<object A>,<object B>}
,可用于提供以下输出:
无需担心下标的文本模式或 的操作符名称样式
Hom
。此输出的代码通常是:
\operatorname{Hom}_{k}(E,E')
\operatorname{Hom}_{\mathcal{O}_X\text{-mod}}(\mathcal{N},\mathcal{M})
\operatorname{Hom}_{A\text{-alg.}}(B,B\otimes_A C)
谢谢这个答案,我对运算符的下标没有进一步的问题,但我仍然希望有自适应括号。在我的问题中,我没有解释为什么我对这个特性感兴趣,乍一看并不明显。
通常我指的两个同态对象很简单,但有时它们是乘积、和、并集、交集等,需要更大的括号来包含。
我首先想到的解决方案是使用\left(
and \right)
,但输出会导致运算符与括号的间距奇怪。简单的解决方案可能是使用\bigl(
/\bigr)
及其变体,编写类似 的内容\Hom[<subscript>]\bigl(\prod A_i, B\bigr)
,但我不想逐个调整维度。
在这张图片中,我希望我已经清楚地说明了为什么需要自适应括号以及间距如何随着不同的编码而变化。最后一行显示了选择括号维度的输出。
这是命令的 MWE:我的第一个版本和我已经引用的答案中的版本
\documentclass{article}
\usepackage{amsmath}
% First try, with subscript space problems
\newcommand{\firstHom}[2][]{%
\operatorname{Hom}_{\textnormal{#1}}\left({#2}\right)%
}
% Command from @egreg answer, without parentheses
\NewDocumentCommand{\answerHom}{o}{%
\operatorname{Hom}\IfValueT{#1}{_{\textnormal{#1}}}%
}
\begin{document}
\subsubsection*{First definition}
\begin{align*}
&\firstHom{A,B} &&
\firstHom[\(k\)-alg]{A,B} &&
\firstHom[\(k\)-alg]{A,\prod_{i\in I}B_i}
\end{align*}
\subsubsection*{Answer definition}
\begin{align*}
&\answerHom(A,B) &&
\answerHom[\(k\)-alg](A,B) &&
\answerHom[\(k\)-alg](A,\prod_{i\in I}B_i)
\end{align*}
\end{document}
这个问题有解决办法吗?也许不是太复杂?
答案1
间距问题由mleftright
包。但是,使用自动缩放的括号很少能产生令人满意的结果。最好自己选择最佳大小。
这是一个可能的实现。辅助宏\scaled@delimiter@expression
在这里有点多余,但我手头有它,而且它做得很好。
\documentclass{article}
\usepackage{amsmath}
% If you really want to use \left and \right:
\usepackage{mleftright}
\makeatletter
% A command for typesetting expressions with (possibly scaled) delimiters.
% Use as follows: \scaled@delimiter@expression[<scale>]{<left_delimiter>}{<middle_delimiter>}{<right_delimiter>}{<expression>}
% Input \auto for auto-scaling, . for obsolete delimiters.
% In the <expression>, type \<pos>@dlmtr where the delimiters belong (<pos> being left, middle or right).
\NewDocumentCommand\scaled@delimiter@expression{o m m m m}{\begingroup
\def\@auto##1{\middle##1\let\auto\@auto}%
\def\left@dlmtr{\let\auto\mleft\ifx\auto#1\relax\else\mathopen\fi\IfValueT{#1}{#1}#2\let\auto\@auto}%
\def\right@dlmtr{\let\auto\mright\ifx\auto#1\relax\else\mathclose\fi\IfValueT{#1}{#1}#4}%
\def\middle@dlmtr{\IfValueT{#1}{#1}#3}%
#5
\endgroup}
\NewDocumentCommand\Hom{e_ o m}{%
\scaled@delimiter@expression[#2]{(}{.}{)}{\operatorname{Hom}\IfValueT{#1}{_{#1}}\left@dlmtr#3\right@dlmtr}%
}
\makeatother
\begin{document}
\begin{gather*}
\Hom{A, B} \\
\Hom[\Big]{A, B} \\
\Hom_{\text{\(k\)-alg}}{A, B} \\
\Hom_{\text{\(k\)-alg}}[\Big]{\prod_{i \in I} A_i, \prod_{i \in I} B_i} \\
\intertext{and if you really want to}
\Hom_{\text{\(k\)-alg}}[\auto]{\prod_{i \in I} A_i, \prod_{i \in I} B_i}
\end{gather*}
\end{document}
但是,我发现标记的模糊性不值得在这里增加好处。括号基本上被圆括号取代了,因此直接输入圆括号更清楚。不寻常的修饰参数也不理想,尽管其他参数类型在这种情况下也有自己的缺点。总而言之,\Hom
看起来像一个运算符,所以最好只使用运算符。
\documentclass{article}
\usepackage{amsmath}
% If you really want to use \left and \right:
\usepackage{mleftright}
\mleftright
\DeclareMathOperator\Hom{Hom}
\begin{document}
\begin{gather*}
\Hom(A, B) \\
\Hom\Bigl( A, B \Bigr) \\
\Hom_{\text{\(k\)-alg}}(A, B) \\
\Hom_{\text{\(k\)-alg}}\Bigl( \prod_{i \in I} A_i, \prod_{i \in I} B_i \Bigr) \\
\intertext{and if you really want to}
\Hom_{\text{\(k\)-alg}}\left( \prod_{i \in I} A_i, \prod_{i \in I} B_i \right)
\end{gather*}
\end{document}