数学公式中的自动调整括号大小

数学公式中的自动调整括号大小

我正在寻找一种在数学模式下自动调整括号大小的方法。在类似这样的公式中(a * (b + c)),我希望外部括号稍微大一点。

理想情况下,这可以在不改变数学语法的情况下完成。也就是说,上面的代码将由 生成$(a * (b+c))$。但如果这不容易实现,我可以使用一些特殊的语法。

我曾看到有人提到 nath,这个包似乎可以自动格式化。据我所知,这个包真的很老了,很难使用。我测试过它,它在我的文档中产生了几十个错误,即使它的 \usepackage 在所有包中最后被调用。

答案1

对于任何目的均不提供任何保证或责任。

\documentclass{article}
% \usepackage{amsmath} % for testing
\newcommand*\autoop{\left(}
\newcommand*\autocp{\right)}
\newcommand*\autoob{\left[}
\newcommand*\autocb{\right]}
\AtBeginDocument {%
   \mathcode`( 32768
   \mathcode`) 32768
   \mathcode`[ 32768
   \mathcode`] 32768
   \begingroup
       \lccode`\~`(
       \lowercase{%
   \endgroup
       \let~\autoop
   }\begingroup
       \lccode`\~`)
       \lowercase{%
   \endgroup
       \let~\autocp
   }\begingroup
       \lccode`\~`[
       \lowercase{%
   \endgroup
       \let~\autoob
   }\begingroup
       \lccode`\~`]
       \lowercase{%
   \endgroup
       \let~\autocb
   }}

\delimiterfactor 1001

\makeatletter
% for amsmath "compatibility" (not sophisticated)
% \usepackage{amsmath}
\AtBeginDocument {%
          \def\resetMathstrut@{%
           \setbox\z@\hbox{\the\textfont\symoperators\char40}%
           \ht\Mathstrutbox@\ht\z@ \dp\Mathstrutbox@\dp\z@}%
}%
\makeatother

\begin{document}

\[ [X+(u*[a  * (b+c)])]*Y \]

\end{document}

生产(添加外部框架):

引用

更新(2018 年 11 月)花括号

根据评论要求:

\documentclass{article}
\newcommand*\autoop{\left(}
\newcommand*\autocp{\right)}
\newcommand*\autoob{\left[}
\newcommand*\autocb{\right]}
\DeclareRobustCommand*\{{\ifmmode \left\lbrace \else \textbraceleft \fi }
\DeclareRobustCommand*\}{\ifmmode \right\rbrace \else \textbraceright \fi }
\AtBeginDocument {%
   \mathcode`( 32768
   \mathcode`) 32768
   \mathcode`[ 32768
   \mathcode`] 32768
   \begingroup
       \lccode`\~`(
       \lowercase{%
   \endgroup
       \let~\autoop
   }\begingroup
       \lccode`\~`)
       \lowercase{%
   \endgroup
       \let~\autocp
   }\begingroup
       \lccode`\~`[
       \lowercase{%
   \endgroup
       \let~\autoob
   }\begingroup
       \lccode`\~`]
       \lowercase{%
   \endgroup
       \let~\autocb
   }}

\delimiterfactor 1001

\makeatletter
% for amsmath "compatibility" (not sophisticated)
% \usepackage{amsmath}
\AtBeginDocument {%
          \def\resetMathstrut@{%
           \setbox\z@\hbox{\the\textfont\symoperators\char40}%
           \ht\Mathstrutbox@\ht\z@ \dp\Mathstrutbox@\dp\z@}%
}%
\makeatother

\begin{document}

\[ \{[X+(\{u*[a  * (\{b+c\})]\})]\}*Y \]

\end{document}

在此处输入图片描述

第二个请求,\|但我认为最好使用mathtools声明和输入语法。

这里不能嵌套\|,且必须成对使用。

\documentclass{article}
\makeatletter
% for amsmath "compatibility" (not sophisticated)
\usepackage{amsmath}
\AtBeginDocument {%
          \def\resetMathstrut@{%
           \setbox\z@\hbox{\the\textfont\symoperators\char40}%
           \ht\Mathstrutbox@\ht\z@ \dp\Mathstrutbox@\dp\z@}%
}%
\makeatother
\newcommand*\autoop{\left(}
\newcommand*\autocp{\right)}
\newcommand*\autoob{\left[}
\newcommand*\autocb{\right]}
\DeclareRobustCommand*\{{\ifmmode \left\lbrace \else \textbraceleft \fi }
\DeclareRobustCommand*\}{\ifmmode \right\rbrace \else \textbraceright \fi }

\AtBeginDocument {%
   \let\originalbardelimiter\|
   \def\myleftbar{\global\let\|\myrightbar\left\originalbardelimiter}%
   \def\myrightbar{\global\let\|\myleftbar\right\originalbardelimiter}%
   \let\|\myleftbar
   \mathcode`( 32768
   \mathcode`) 32768
   \mathcode`[ 32768
   \mathcode`] 32768
   \begingroup
       \lccode`\~`(
       \lowercase{%
   \endgroup
       \let~\autoop
   }\begingroup
       \lccode`\~`)
       \lowercase{%
   \endgroup
       \let~\autocp
   }\begingroup
       \lccode`\~`[
       \lowercase{%
   \endgroup
       \let~\autoob
   }\begingroup
       \lccode`\~`]
       \lowercase{%
   \endgroup
       \let~\autocb
   }}

\delimiterfactor 1001


\begin{document}

\[ \{[X+(\{\|u\|*\| [ a * (\{b+c\})] \|\} )] \}*\|Y\| \]

\end{document}

在此处输入图片描述

最后,(但这越来越不靠谱了),一个允许嵌套\|一层的技巧。对于 Banach 空间理论中的用例来说可能已经足够了(我听说这是 20 世纪的老式数学,那是很久以前的事了,所以对于 AI 出现之前的人类基本思维来说可能已经足够了)(*)

(*) 我是否应该解释一下,我不相信高薪软件行业向我们提出的有关人工智能未来将会是什么的任何说法?

\documentclass{article}
\makeatletter
% for amsmath "compatibility" (not sophisticated)
\usepackage{amsmath}
\AtBeginDocument {%
          \def\resetMathstrut@{%
           \setbox\z@\hbox{\the\textfont\symoperators\char40}%
           \ht\Mathstrutbox@\ht\z@ \dp\Mathstrutbox@\dp\z@}%
}%
\makeatother
\newcommand*\autoop{\left(}
\newcommand*\autocp{\right)}
\newcommand*\autoob{\left[}
\newcommand*\autocb{\right]}
\DeclareRobustCommand*\{{\ifmmode \left\lbrace \else \textbraceleft \fi }
\DeclareRobustCommand*\}{\ifmmode \right\rbrace \else \textbraceright \fi }

\newif\ifinsidebracedgroup
\AtBeginDocument {%
   \let\originalbardelimiter\|
   \def\myleftbar{\ifinsidebracedgroup
                        \right\originalbardelimiter
                        \global\insidebracedgroupfalse
                  \else
                        \left\originalbardelimiter
                  \fi
                  \global\let\|\myrightbar}%
   \def\myrightbar{\ifnum\currentgrouptype=9
                        \left\originalbardelimiter
                        \global\insidebracedgrouptrue
                  \else
                        \right\originalbardelimiter
                  \fi
                 \global\let\|\myleftbar}%
   \let\|\myleftbar
   \mathcode`( 32768
   \mathcode`) 32768
   \mathcode`[ 32768
   \mathcode`] 32768
   \begingroup
       \lccode`\~`(
       \lowercase{%
   \endgroup
       \let~\autoop
   }\begingroup
       \lccode`\~`)
       \lowercase{%
   \endgroup
       \let~\autocp
   }\begingroup
       \lccode`\~`[
       \lowercase{%
   \endgroup
       \let~\autoob
   }\begingroup
       \lccode`\~`]
       \lowercase{%
   \endgroup
       \let~\autocb
   }}

\delimiterfactor 1001


\begin{document}

\[ \{[X+(\{\|u\|*\| [ a * (\{{\|b+c\|}\})] \|\} )] \}*\|Y\| \]

\[ \| (X - {\|X\|} e)\|^2 + \| (X + {\|X\|} e)\|^2 = 4\|(X)\|^2 \]

\end{document}

在此处输入图片描述

答案2

这篇评论太长了。所有荣誉都归于 jfbu。

我将 jfbu 的解决方案编辑为

  • 通过使用堆栈,允许任意深度的嵌套\|...\|(假设中间有不同类型的括号)。
  • 还可以自动调整大小|...|

例子

\documentclass{article}
\usepackage{ifthen}
% https://tex.stackexchange.com/questions/45946/stack-datastructure-using-latex
\makeatletter
\newcommand\newstack[1]{\let#1\@empty}
\newcommand{\addQelement}[2]{\gdef\element{#2}\pushQelement{#1}}
\newcommand{\pushQelement}[1]{\xdef#1{\element+#1}}
\long\def\popQ#1+#2\@nil#3{\gdef\poppedQelement{#1}\gdef#3{#2}}
\long\def\peekQ#1+#2\@nil#3{\gdef\poppedQelement{#1}}
\newcommand\popQelement[1]{\ifx #1\@empty  Error\else\expandafter\popQ#1\@nil#1\fi}
\newcommand\peekQelement[1]{\ifx #1\@empty  Error\else\expandafter\peekQ#1\@nil#1\fi}
\makeatother

\makeatletter
% for amsmath "compatibility" (not sophisticated)
\usepackage{amsmath}
\AtBeginDocument {%
          \def\resetMathstrut@{%
           \setbox\z@\hbox{\the\textfont\symoperators\char40}%
           \ht\Mathstrutbox@\ht\z@ \dp\Mathstrutbox@\dp\z@}%
}%
\makeatother
\newcommand*\autooS{\peekQelement{\bracketstack}\ifthenelse{\equal{\poppedQelement}{S}}{\right\originalbardelimiterS\popQelement{\bracketstack}}{\left\originalbardelimiterS\addQelement{\bracketstack}{S}}}
\newcommand*\autoop{\left(\addQelement{\bracketstack}{p}}
\newcommand*\autocp{\right)\popQelement{\bracketstack}}
\newcommand*\autoob{\left[\addQelement{\bracketstack}{b}}
\newcommand*\autocb{\right]\popQelement{\bracketstack}}
\DeclareRobustCommand*\{{\ifmmode \left\lbrace\addQelement{\bracketstack}{c} \else \textbraceleft \fi }
\DeclareRobustCommand*\}{\ifmmode \right\rbrace\popQelement{\bracketstack} \else \textbraceright \fi }

\newstack{\bracketstack}
\addQelement{\bracketstack}{START}
\newif\ifinsidebracedgroup
\AtBeginDocument {%
   \let\originalbardelimiter\|
   \let\originalbardelimiterS|
   \def\mysbar{\peekQelement{\bracketstack}\ifthenelse{\equal{\poppedQelement}{s}}{\right\originalbardelimiter\popQelement{\bracketstack}}{\left\originalbardelimiter\addQelement{\bracketstack}{s}}}%
   \let\|\mysbar
   \mathcode`( 32768
   \mathcode`) 32768
   \mathcode`[ 32768
   \mathcode`] 32768
   \mathcode`| 32768

   \begingroup
       \lccode`\~`(
       \lowercase{%
   \endgroup
       \let~\autoop
   }\begingroup
       \lccode`\~`)
       \lowercase{%
   \endgroup
       \let~\autocp
   }\begingroup
       \lccode`\~`[
       \lowercase{%
   \endgroup
       \let~\autoob
   }\begingroup
       \lccode`\~`]
       \lowercase{%
   \endgroup
       \let~\autocb
   }\begingroup
       \lccode`\~`|
       \lowercase{%
   \endgroup
       \let~\autooS
   }}

\delimiterfactor 1001
\begin{document}
\[ \{[X+(\{\|u\|*\| [ a * (\{{\|b+c\|}\})] \|\} )] \}*\|Y\| \]
\[ \| (X - {\|X\|} e)\|^2 + \| (X + {\|X\|} e)\|^2 = 4\|(X)\|^2 \]
\[ \|(\|\{\|[\|a\|]\|\}\|)\|+\|a\| \]
\[ \|(\|\{\|[\|a\|]\|\}\|)\|+\||\||a|+|a|\|+\|a\||\| \]
\end{document}

相关内容