줄 바꿈에도 불구하고 \left, \right 구분 기호가 자동으로(!) 동일한 크기를 갖도록 하려면 어떻게 해야 합니까?

줄 바꿈에도 불구하고 \left, \right 구분 기호가 자동으로(!) 동일한 크기를 갖도록 하려면 어떻게 해야 합니까?

이 코드

\documentclass{article}

\usepackage{amsmath}

\begin{document}
\begin{align*}
\begin{split}
    z = \left( a + b + c \right. \\ 
        \left. + \frac{d}{e} \right)
\end{split} 
\end{align*}
\end{document}

다음과 같은 출력이 생성됩니다.

여기에 이미지 설명을 입력하세요

두 구분 기호의 크기가 다릅니다. 일치하는 크기를 얻는 일반적인 방법은 \vphantom다음과 같이 사용하는 것입니다.

\documentclass{article}

\usepackage{amsmath}

\begin{document}
\begin{align*}
\begin{split}
    z = \left( a + b + c +\vphantom{\frac{d}{e}}\right. \\  
        \left. + \frac{d}{e} \right)
\end{split} 
\end{align*}
\end{document}

이는 다음과 같은 출력을 생성합니다.

여기에 이미지 설명을 입력하세요

그러나 그러한 접근 방식은

  • 급속도로 변하다복잡한줄 바꿈 수가 증가함에 따라;
  • ~이다유지보수가 불가능하다(한 줄의 내용이 변경되면 원하는 출력을 얻기 위해 인수 \vphantom도 수정해야 할 수 있기 때문입니다.)

대체 접근 방식 1: 구분 기호의 크기를 수동으로 조정합니다( \big및 유사 항목 사용). 안타깝게도 유지 관리가 쉽지 않습니다.

대체 접근 방식 2: 패키지에서 제공하는 일부 수학 환경을 사용하여 두 / 구분 기호 breqn사이에 줄 바꿈을 허용 하고 구분 기호 크기를 관리합니다. 하지만 가능하다면 멀리하고 싶습니다 .\left\rightbreqn


(명시적으로) 트릭을 사용하지 않고도 줄 바꿈에도 불구하고 자동으로 동일한 크기를 갖도록 관련 \left/ 구분 기호를 만드는 방법을 생각할 수 있습니까 ? 이상적으로 솔루션은 여러 개의 중첩된 구분 기호 쌍에 대해 작동해야 합니다. 예를 들어 다음에서는 내부 구분 기호의 크기가 동일해야 하고 외부 구분 기호의 크기도 동일해야 합니다.right\\vphantom

\left( \left( ... \right. \right. \\
\left. \left. ... \right) \right)

답변1

다음 예에서는 패키지를 사용하여 zref레이블의 수학 공식 크기를 기억합니다. 패키지는 및 에 mleftright의해 추가 수평 간격을 줄이는 데 사용됩니다 .\left\right

복잡한 수학 블록 내에서 다음 매크로를 사용할 수 있습니다.

\mzleft{<label>}{<left delimiter>}{<math formula>}
\mzright{<label>}{<math formula>}{<right delimiter>}

매크로는 중첩될 수 있으며 <label>구분 기호 쌍을 식별하는 데 필요합니다. 수학 블록(수학 환경, ...) 내에서 <label>쌍의 이름은 고유해야 합니다. 수학 블록을 \mzreset호출한 후. 이름을 해제 <label>하고 재사용할 수 있습니다.

예시 파일:

\documentclass{article}

\usepackage{amsmath}
\usepackage{mleftright}
\usepackage{zref-base}

\makeatletter
\zref@newprop{mzheight}[0pt]{\the\ht\z@}
\zref@newprop{mzdepth}[0pt]{\the\dp\z@}
\newcount\c@@mz
\newcommand*{\the@mz}{mz\the\c@@mz}
\newcommand*{\@mz@list}{}    
\let\@mz@do\relax
\newcommand*{\mzreset}{%
  \begingroup
    \def\@mz@do##1{%
      \global\expandafter\let\csname mz@##1\endcsname\relax
    }%
    \@mz@list
    \global\let\@mz@list\@empty
  \endgroup
}
\newcommand*{\mzleft}[3]{%
  \@ifundefined{mz@#1}{%
    \global\advance\c@@mz\@ne
    \expandafter\xdef\csname mz@#1\endcsname{\the@mz}%
    \xdef\@mz@list{\@mz@list\@mz@do{#1}}%
  }{}%
  \expandafter\let\expandafter\@mz\csname mz@#1\endcsname
  \mleft#2%
  \expandafter\mathpalette\expandafter{%
    \expandafter\@mzleft\expandafter{\@mz}%
  }{#3}%
  \mright.\kern-\nulldelimiterspace
}
\newcommand*{\mzright}[3]{%
  \kern-\nulldelimiterspace
  \@ifundefined{mz@#1}{%   
    \@latex@warning{Missing \string\mzleft{#1}}%
    \mleft.#2\mright#3%
  }{%
    \expandafter\let\expandafter\@mz\csname mz@#1\endcsname
    \mleft.%
    \expandafter\mathpalette\expandafter{%
      \expandafter\@mzright\expandafter{\@mz}%
    }{#2}%
    \mright#3%
  }%
}   
\newcommand*{\@mzleft}{%
  \@mzleftright lr%
}
\newcommand*{\@mzright}{%
  \@mzleftright rl%
}
\newcommand*{\@mzleftright}[5]{%
  \sbox0{$\m@th#4{}#5{}$}%
  \ifmeasuring@
  \else
    \begingroup
      \let\@auxout\@mainaux
      \zref@labelbyprops{#3#1}{mzheight,mzdepth}%
    \endgroup
  \fi
  \zifrefundefined{\@mz #2}{%
  }{%
    \dimen@=\zref@extract{#3#2}{mzheight}\relax
    \ifdim\dimen@>\ht0 %
      \ht0=\dimen@
    \fi
    \dimen@=\zref@extract{#3#2}{mzdepth}\relax
    \ifdim\dimen@>\dp0 %
      \dp0=\dimen@
    \fi
  }%   
  \copy0\relax
}
\makeatother

\begin{document}
\begin{align*}
\begin{split}
    z = \mzleft{a}({ a + b + c +} \\
        \mzright{a}{{}+ \frac{d}{e}})
\end{split} 
\end{align*}   

\mzreset

\begin{align*}
\begin{split}
    z = \mzleft{a}{[}{%
          a + b + \frac{c}{d} +
          \mzleft{b}{(}{
            \int_0^\infty \mathrm{d}x
          }   
        } \\  
        \mzright{b}{
          + y}{)
        }
        \mzright{a}{
          + \frac{\displaystyle\sum_{i=0}^{100}i}{e}
        }{]}
\end{split}   
\end{align*}  
\end{document}

결과

답변2

나는 a) \bigls가 바람직하다고 생각하고 b) 수동으로 하이픈을 넣고 교정 마지막에 가끔 s를 사용하여 구분 기호를 크게 하는 것이 바로 거기에 있다고 생각하지만 \enlargethispage, 다음과 같은 방법을 사용하면 유지 관리가 더 쉬워진다는 것을 알 수 있습니다.

\newcommand\SPLIT[2]{%
  \left( #1\vphantom{#2}\right. \\
  \left. \vphantom{#1}#2\right) \\
}

\begin{align*}
  \begin{split}
    z= \SPLIT{a + b + c +}{d +\frac{d}{e}}
  \end{split}
\end{align*}

최소한 크기 조정 인수를 수동으로 반복하지 않아도 됩니다. 충분히 기울어지면 다양한 라인 수를 처리하도록 확장될 수 있다고 확신합니다.

답변3

언급할만한 가치가 있습니다. nath패키지는 이를 지원하지만 불행히도 다른 많은 패키지와 호환되지 않습니다.

일부 수정(*)을 거쳐 문서에서 직접 가져왔습니다.

%! TEX program = lualatex
\documentclass{article}
\usepackage{nath}
\begin{document}
\[
\sin 2nx = 2n \cos x [\sin x \\
\qquad + \sum_{k = 1}^n (-4)^k
\frac{(n^2 - 1^2)(n^2 - 2^2) \dots (n^2 - k^2)}{(2k - 1)!}
\sin^{2k - 1} x]
\]
\end{document}

출력:

산출

또한보십시오:

(*): naththen $$\[는 정확히 동일합니다. 그렇지 않으면 $$ ... $$지원되지 않는 LaTeX 구문입니다.$$ ... $$보다 \[ ... \]를 선호하는 이유는 무엇입니까?.

답변4

이 질문은 방금 부딪혔고 승인된 답변이 있으므로 ConTeXt를 사용하는 답변을 추가하는 것도 괜찮다고 생각합니다. 일부 사용자가 관심을 가질 수 있기 때문입니다.

ConTeXt 수식에서는 기본적으로 줄을 분할하여 울타리에 끊김이 있을 수 있습니다. 수동 줄 바꿈은 으로 수행됩니다 \breakhere.

\starttext
\samplefile{tufte}

\startformula[align=slanted,margin=2em]
    \int_0^1 \frac{x^9}{(x^2+1)^{16}} \dd x 
    = \int_0^1 \left[
         \frac{x} {(x^2+1)^{12}}
        -\frac{4x}{(x^2+1)^{13}}
        +\frac{6x}{(x^2+1)^{14}}
        \breakhere
        -\frac{4x}{(x^2+1)^{15}}
        +\frac{x} {(x^2+1)^{16}}
        \right] \dd x
\stopformula

\samplefile{douglas}
\stoptext

울타리 내부에서 분할되어 두 줄에 걸쳐 실행되는 공식

관련 정보