너비를 측정하려면 \intertext와 \shortintertext를 재정의하세요.

너비를 측정하려면 \intertext와 \shortintertext를 재정의하세요.

를 측정하려고 합니다.자연적인 폭align*(documentclass 옵션 사용 ) 의 fleqn의견에서 언급되었습니다. 정렬의 자연스러운 너비 결정*: 표시가 정확하더라도 varwidth는 \linewidth를 사용합니다.\intertext전체를 사용하는 것입니다 \linewidth. 그래서 해결책소리간단하고 재정의 \intertext하고 .\shortintertext\varwidth

문제는 를 사용하는 것이 \let무시되는 것처럼 보이므로 이 두 매크로를 재정의하는 것이 까다로워 보인다는 것입니다. MWE는 \intertext\shorintertext나머지 부분과 별도로 너비를 측정하여 마지막 두 테스트 사례를 처리하기 위한 것입니다 align*.

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

참고자료:

암호:

\documentclass[fleqn]{article}
\usepackage{etoolbox}
\usepackage{mathtools}
\usepackage{varwidth}

\usepackage{printlen}
\uselengthunit{mm}

\makeatletter
%% Fix for varwidth to work with fleqn option
%% https://tex.stackexchange.com/questions/394778/align-in-varwidth-seems-to-ignore-fleqn-option
\let\@vwid@eqmodetrue\@vwid@eqmodefalse

\newsavebox{\@IntertextSavebox}
\newlength{\@MaxIntertextWidth}
\newcommand{\MeasureIntertext}[1]{%
    \savebox{\@IntertextSavebox}{%
        \begin{varwidth}{\linewidth}
            #1%
        \end{varwidth}%
    }%
    %% Keep track of the maximum width of any \shorintertext and
    %% \intertext within this align* environment.
    \ifdim\wd\@IntertextSavebox>\@MaxIntertextWidth
        \setlength{\@MaxIntertextWidth}{\wd\@IntertextSavebox}%
    \fi
}%
\newsavebox{\@NonIntertextBox}
\newcommand{\GetNaturalVarwidth}[3]{%
    %% #1 = length to contain the width
    %% #2 = title for this test case
    %% #3 = text to measure
    \setlength{\@MaxIntertextWidth}{0pt}%
    \savebox{\@NonIntertextBox}{%
        \begin{varwidth}{\linewidth}
            %% ------------------------------------------------------ Problem Area
            %% This attempt to redefine these two seems to be ignored.
            \let\shortintertext\MeasureIntertext
            \let\intertext\MeasureIntertext
            %% ------------------------------------------------------ 
            #3%
        \end{varwidth}%
    }%
    %% ------------------------------------------
    %% For debugging purposes show the box.
    \medskip\par
    \noindent%
    {\bfseries#2}%
    \par\noindent
    \fboxsep=0pt
    \fbox{%
        \usebox{\@NonIntertextBox}%
    }%
    \ifdim\wd\@IntertextSavebox>\wd\@NonIntertextBox
        \setlength{#1}{\wd\@IntertextSavebox}%
    \else
        \setlength{#1}{\wd\@NonIntertextBox}%
    \fi
    {\par\tiny Natural Width is \printlength{#1}.}%
}%
\makeatother

\newlength{\NaturalWidth}
\begin{document}
\GetNaturalVarwidth{\NaturalWidth}{Small text}{Small text}% Works

%% These two don't work, but right now am just focusing on align*
%\GetNaturalVarwidth{\NaturalWidth}{Single Display Equation}{%
%\[
%    F = ma.
%\]
%}
%
%\GetNaturalVarwidth{\NaturalWidth}{Single display equation with text}{%
%Single display equation
%\[
%    F = ma.
%\]
%and some more text.%
%}

\GetNaturalVarwidth{\NaturalWidth}{Single align*}{%
\begin{align*}
    F &= ma.
\end{align*}%
}

\GetNaturalVarwidth{\NaturalWidth}{Align* with text}{%
Famous Equations:
\begin{align*}
    F &= ma. \\
    E &= mc^2,
\end{align*}%
or at least they should be famous.
}

\GetNaturalVarwidth{\NaturalWidth}{Align* with shortintertext}{%
\begin{align*}
    F &= ma. \\
    \shortintertext{and}
    E &= mc^2,
\end{align*}%
}
This one above should be 23.42914mm.

\GetNaturalVarwidth{\NaturalWidth}{Align* with intertext}{%
\begin{align*}
    F &= ma. \\
    \intertext{with some longer intertext}
    E &= mc^2,
\end{align*}%
}
This one above should be greater than 23.42914mm 
(which is width of just the nonintertext portion).

\end{document}

목록 파일

오류가 발생했습니다.

Undefined control sequence.
\shortintertext ...th }\normalbaselines \if_dim:w

제공된 답변을 실행하는 동안 다음 출력을 포함해야 한다고 생각했습니다 \listfiles.

 *File List*
 article.cls    2014/09/29 v1.4h Standard LaTeX document class
   fleqn.clo    2016/12/29 v1.2a Standard LaTeX option (flush left equations)
  size10.clo    2014/09/29 v1.4h Standard LaTeX file (size option)
etoolbox.sty    2018/02/11 v2.5e e-TeX tools for LaTeX (JAW)
mathtools.sty    2018/01/08 v1.21 mathematical typesetting tools
  keyval.sty    2014/10/28 v1.15 key=value parser (DPC)
    calc.sty    2014/10/28 v4.3 Infix arithmetic (KKT,FJ)
 mhsetup.sty    2017/03/31 v1.3 programming setup (MH)
 amsmath.sty    2017/09/02 v2.17a AMS math features
 amstext.sty    2000/06/29 v2.01 AMS text
  amsgen.sty    1999/11/30 v2.0 generic functions
  amsbsy.sty    1999/11/29 v1.2d Bold Symbols
  amsopn.sty    2016/03/08 v2.02 operator names
varwidth.sty    2009/03/30 ver 0.92;  Variable-width minipages
printlen.sty    2009/09/03 v1.1a print lengths with units
graphicx.sty    2017/06/01 v1.1a Enhanced LaTeX Graphics (DPC,SPQR)
graphics.sty    2017/06/25 v1.2c Standard LaTeX Graphics (DPC,SPQR)
    trig.sty    2016/01/03 v1.10 sin cos tan (DPC)
graphics.cfg    2016/06/04 v1.11 sample graphics configuration
  pdftex.def    2018/01/08 v1.0l Graphics/color driver for pdftex
supp-pdf.mkii
epstopdf-base.sty    2016/05/15 v2.6 Base part for package epstopdf
infwarerr.sty    2016/05/16 v1.4 Providing info/warning/error messages (HO)
  grfext.sty    2016/05/16 v1.2 Manage graphics extensions (HO)
kvdefinekeys.sty    2016/05/16 v1.4 Define keys (HO)
 ltxcmds.sty    2016/05/16 v1.23 LaTeX kernel commands for general use (HO)
kvoptions.sty    2016/05/16 v3.12 Key value format for package options (HO)
kvsetkeys.sty    2016/05/16 v1.17 Key value parser (HO)
etexcmds.sty    2016/05/16 v1.6 Avoid name clashes with e-TeX commands (HO)
ifluatex.sty    2016/05/16 v1.4 Provides the ifluatex switch (HO)
pdftexcmds.sty    2018/01/21 v0.26 Utility functions of pdfTeX for LuaTeX (HO)
   ifpdf.sty    2017/03/15 v3.2 Provides the ifpdf switch
epstopdf-sys.cfg    2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Live
 ***********

답변1

패키지는 지원되는 일부 환경 외부에서 사용되는 경우 오류 메시지를 발생시키도록 amsmath정의합니다 . 이러한 환경에서 정의하는 데 \intertext사용됩니다 . 그러므로 재정의할 필요가 있다.\intertext@\intertext\intertext@

\shortintertext패키지로 제공되며 mathtools직접 재정의할 수 있습니다.

다음 코드 조각은 in 및 \vbox{...}으로 대체됩니다 .\begin{varwidth}{\linewidth}...\end{varwidth}\intertext\shortintertext

\def\intertext@measuring{% see \intertext@ in amsmath
  \def\intertext##1{%
    \ifvmode\else\\\@empty\fi
    \noalign{%
      \penalty\postdisplaypenalty\vskip\belowdisplayskip
      %\vbox{
      \begin{varwidth}{\linewidth}%
        \normalbaselines
        \ifdim\linewidth=\columnwidth
        \else \parshape\@ne \@totalleftmargin \linewidth
        \fi
        \noindent##1\par
      %}%
      \end{varwidth}%
      \penalty\predisplaypenalty\vskip\abovedisplayskip%
    }%
  }%
}

\MHInternalSyntaxOn
\def\shortintertext@measuring#1{% see \MT_shortintertext:n in mathtools
  \ifvmode\else\\\@empty\fi
  \noalign{%
    \penalty\postdisplaypenalty\vskip\abovedisplayshortskip
    \vskip-\lineskiplimit
    \vskip\normallineskiplimit
    \vskip\l_MT_above_shortintertext_sep
    %\vbox{%
    \begin{varwidth}{\linewidth}%
      \normalbaselines
      \if_dim:w
        \if_dim:w \@totalleftmargin=\z@
          \linewidth
        \else:
          -\maxdimen
        \fi:
        =\columnwidth
      \else:
        \parshape\@ne \@totalleftmargin \linewidth
      \fi:
      \noindent#1\par
    %}%
    \end{varwidth}%
    \penalty\predisplaypenalty\vskip\abovedisplayshortskip%
    \vskip-\lineskiplimit
    \vskip\normallineskiplimit
    \vskip\l_MT_below_shortintertext_sep
  }%
}
\MHInternalSyntaxOff

그런 다음 재정의 명령은 다음과 같습니다.

\let\shortintertext\shortintertext@measuring
\let\intertext@\intertext@measuring

이제 예제의 측정이 개선되었습니다.

결과

전체 예(이 답변의 코드가 추가된 질문의 예):

\documentclass[fleqn]{article}
\usepackage{etoolbox}
\usepackage{mathtools}
\usepackage{varwidth}

\usepackage{printlen}
\uselengthunit{mm}

\makeatletter

\def\intertext@measuring{% see \intertext@ in amsmath
  \def\intertext##1{%
    \ifvmode\else\\\@empty\fi
    \noalign{%
      \penalty\postdisplaypenalty\vskip\belowdisplayskip
      %\vbox{
      \begin{varwidth}{\linewidth}%
        \normalbaselines
        \ifdim\linewidth=\columnwidth
        \else \parshape\@ne \@totalleftmargin \linewidth
        \fi
        \noindent##1\par
      %}%
      \end{varwidth}%
      \penalty\predisplaypenalty\vskip\abovedisplayskip%
    }%
  }%
}

\MHInternalSyntaxOn
\def\shortintertext@measuring#1{% see \MT_shortintertext:n in mathtools
  \ifvmode\else\\\@empty\fi
  \noalign{%
    \penalty\postdisplaypenalty\vskip\abovedisplayshortskip
    \vskip-\lineskiplimit
    \vskip\normallineskiplimit
    \vskip\l_MT_above_shortintertext_sep
    %\vbox{%
    \begin{varwidth}{\linewidth}%
      \normalbaselines
      \if_dim:w
        \if_dim:w \@totalleftmargin=\z@
          \linewidth
        \else:
          -\maxdimen
        \fi:
        =\columnwidth
      \else:
        \parshape\@ne \@totalleftmargin \linewidth
      \fi:
      \noindent#1\par
    %}%
    \end{varwidth}%
    \penalty\predisplaypenalty\vskip\abovedisplayshortskip%
    \vskip-\lineskiplimit
    \vskip\normallineskiplimit
    \vskip\l_MT_below_shortintertext_sep
  }%
}
\MHInternalSyntaxOff

%% Fix for varwidth to work with fleqn option
%% https://tex.stackexchange.com/questions/394778/align-in-varwidth-seems-to-ignore-fleqn-option
\let\@vwid@eqmodetrue\@vwid@eqmodefalse

\newsavebox{\@IntertextSavebox}
\newlength{\@MaxIntertextWidth}
\newcommand{\MeasureIntertext}[1]{%
    \savebox{\@IntertextSavebox}{%
        \begin{varwidth}{\linewidth}
            #1%
        \end{varwidth}%
    }%
    %% Keep track of the maximum width of any \shorintertext and
    %% \intertext within this align* environment.
    \ifdim\wd\@IntertextSavebox>\@MaxIntertextWidth
        \setlength{\@MaxIntertextWidth}{\wd\@IntertextSavebox}%
    \fi
}%
\newsavebox{\@NonIntertextBox}
\newcommand{\GetNaturalVarwidth}[3]{%
    %% #1 = length to contain the width
    %% #2 = title for this test case
    %% #3 = text to measure
    \setlength{\@MaxIntertextWidth}{0pt}%
    \savebox{\@NonIntertextBox}{%
        \begin{varwidth}{\linewidth}
            %% ------------------------------------------------------ Problem Area
            %% This attempt to redefine these two seems to be ignored.
            %\let\shortintertext\MeasureIntertext
            \let\shortintertext\shortintertext@measuring
            %\let\intertext\MeasureIntertext
            \let\intertext@\intertext@measuring
            %% ------------------------------------------------------ 
            #3%
        \end{varwidth}%
    }%
    %% ------------------------------------------
    %% For debugging purposes show the box.
    \medskip\par
    \noindent%
    {\bfseries#2}%
    \par\noindent
    \fboxsep=0pt
    \fbox{%
        \usebox{\@NonIntertextBox}%
    }%
    \ifdim\wd\@IntertextSavebox>\wd\@NonIntertextBox
        \setlength{#1}{\wd\@IntertextSavebox}%
    \else
        \setlength{#1}{\wd\@NonIntertextBox}%
    \fi
    {\par\tiny Natural Width is \printlength{#1}.}%
}%
\makeatother

\newlength{\NaturalWidth}
\begin{document}
\GetNaturalVarwidth{\NaturalWidth}{Small text}{Small text}% Works

%% These two don't work, but right now am just focusing on align*
%\GetNaturalVarwidth{\NaturalWidth}{Single Display Equation}{%
%\[
%    F = ma.
%\]
%}
%
%\GetNaturalVarwidth{\NaturalWidth}{Single display equation with text}{%
%Single display equation
%\[
%    F = ma.
%\]
%and some more text.%
%}

\GetNaturalVarwidth{\NaturalWidth}{Single align*}{%
\begin{align*}
    F &= ma.
\end{align*}%
}

\GetNaturalVarwidth{\NaturalWidth}{Align* with text}{%
Famous Equations:
\begin{align*}
    F &= ma. \\
    E &= mc^2,
\end{align*}%
or at least they should be famous.
}

\GetNaturalVarwidth{\NaturalWidth}{Align* with shortintertext}{%
\begin{align*}
    F &= ma. \\
    \shortintertext{and}
    E &= mc^2,
\end{align*}%
}
This one above should be 23.42914mm.

\GetNaturalVarwidth{\NaturalWidth}{Align* with intertext}{%
\begin{align*}
    F &= ma. \\
    \intertext{with some longer intertext}
    E &= mc^2,
\end{align*}%
}
This one above should be greater than 23.42914mm 
(which is width of just the nonintertext portion).

\end{document}

관련 정보