我正在寻找一种在数学模式下自动调整括号大小的方法。在类似这样的公式中(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}