
를 측정하려고 합니다.자연적인 폭align*
(documentclass 옵션 사용 ) 의 fleqn
의견에서 언급되었습니다.
정렬의 자연스러운 너비 결정*: 표시가 정확하더라도 varwidth는 \linewidth를 사용합니다.\intertext
전체를 사용하는 것입니다 \linewidth
. 그래서 해결책소리간단하고 재정의 \intertext
하고 .\shortintertext
\varwidth
문제는 를 사용하는 것이 \let
무시되는 것처럼 보이므로 이 두 매크로를 재정의하는 것이 까다로워 보인다는 것입니다. MWE는 \intertext
및 \shorintertext
나머지 부분과 별도로 너비를 측정하여 마지막 두 테스트 사례를 처리하기 위한 것입니다 align*
.
참고자료:
- 정렬의 자연스러운 너비 결정*: 표시가 정확하더라도 varwidth는 \linewidth를 사용합니다.
- varwidth의 align*이 fleqn 옵션을 무시하는 것 같습니다.
- 이것은 관련 질문이지만 답변에는 재정의가 포함되지 않았습니다
\intertext
.\intertext 및 \shortintertext 주변에 조건을 적용하면 세로 공간이 초과됩니다..
암호:
\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}