Definieren Sie \intertext und \shortintertext neu, um ihre Breite zu messen

Definieren Sie \intertext und \shortintertext neu, um ihre Breite zu messen

Ich versuche zu messen,natürliche Breitevon einem align*(mit der fleqnOption documentclass) und wurden in den Kommentaren unter Bestimmen Sie die natürliche Breite von align*: varwidth verwendet \linewidth, obwohl die Anzeige korrekt istdas \intertextnutzt die gesamte \linewidth. Also, LösungGeräuscheeinfach, neu definieren \intertext(und \shortintertextund separat messen über \varwidth).

Das Problem ist, dass es schwierig erscheint, diese beiden Makros neu zu definieren, da die Verwendung von \letignoriert zu werden scheint. Das MWE soll die letzten beiden Testfälle ansprechen, indem die Breite von \intertextund \shorintertextgetrennt vom Rest von gemessen wird align*.

Bildbeschreibung hier eingeben

Verweise:

Code:

\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}

Listendateien

Ich erhalte eine Fehlermeldung

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

beim Ausführen der bereitgestellten Antwort dachte ich, ich sollte die Ausgabe von \listfiles: einschließen.

 *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
 ***********

Antwort1

Das Paket amsmathdefiniert \intertext, dass eine Fehlermeldung ausgegeben wird, wenn es außerhalb bestimmter Umgebungen verwendet wird, in denen es unterstützt wird. Es wird in diesen Umgebungen \intertext@definiert \intertext. Daher \intertext@muss es neu definiert werden.

\shortintertextwird vom Paket bereitgestellt mathtoolsund kann direkt neu definiert werden.

Der folgende Codeausschnitt ersetzt \vbox{...}durch \begin{varwidth}{\linewidth}...\end{varwidth}in \intertextund \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

Dann die Neudefinitionsbefehle:

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

Die Messung des Beispiels wurde verbessert:

Ergebnis

Vollständiges Beispiel (nur das Beispiel aus der Frage mit dem hinzugefügten Code aus dieser Antwort):

\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}

verwandte Informationen