对齐环境中的脚注

对齐环境中的脚注

似乎不是\footnote应该按照这个恰当命名的问题在数学模式下使用:数学模式下的脚注。但是,看来我可以让它工作,而不必诉诸\footnotemark\footnotetext,只要我使用minipage

\begin{minipage}{0.5\linewidth}
\begin{align*}
    E &= mc^3 &&\text{Einstein}\footnote{Better check this.}
\end{align*}
\end{minipage}

得出的结果是:

enter image description here

好的,看来这是可行的。

但是等一下……文本\footnote重复了!!!嗯,一定是对齐经过了测量阶段。好的,那么应该很容易修复:我们需要做的就是检查\ifmeasuring@

\makeatletter
\newcommand{\AlignFootnote}[1]{%
    \ifmeasuring@
    \else
        \footnote{#1}%
    \fi
}
\makeatother

现在使用\AlignFootnote{}而不是\footnote{}我们得到期望的结果:

enter image description here

好的,但在第一个用例(爱因斯坦)中,我恰好在\footnote里面使用了\text{}。尝试\AlignFootnote{}在外面使用\text{}(牛顿)确实会因为某种原因搞砸这件事:

enter image description here

因此在牛顿用例中,看起来好像外部的内容\text{}经过了 4 次非测量传递。

尝试修复:

显然,要尝试的方法是使用\text{\footnote{#1}},但这不仅对第二种用例没有影响,而且还搞乱了第一种用例:两个脚注都出现了 4 次。

问题:

  • 主要问题:有没有办法检测外面的重复传递,\text{}以便我不需\footnotes诉诸\footnotemark/就不会重复\footnotetext
  • 为什么minipage需要它?没有它,它们\footnotes根本不会显示。是否需要某种刷新类型的宏才能使它们显示出来?

代码:

\documentclass{article}
\usepackage{amsmath}

\makeatletter
\newcommand{\AlignFootnote}[1]{%
    \ifmeasuring@
    \else
        \footnote{#1}%
    \fi
}
\makeatother

\begin{document}
\begin{minipage}{0.5\linewidth}
\begin{align*}
    E &= mc^3 &&\text{Einstein}\AlignFootnote{Better check this.} \\
    F &= mb   &&\text{Newton\AlignFootnote{This also seems wrong for some reason.}}
\end{align*}
\end{minipage}
\end{document}

答案1

amstext.sty\iffirstchoice@为此定义一个测试:在内部\mathchoice调用的第一个分支中为真\text,在其余三个分支中为假。

\documentclass{article}
\usepackage{amsmath}

\makeatletter
\newcommand{\AlignFootnote}[1]{%
  \ifmeasuring@
  \else
    \iffirstchoice@
      \footnote{#1}%
    \fi
  \fi}
\makeatother

\begin{document}
\begin{minipage}{0.5\linewidth}
\begin{align*}
    E &= mc^3 &&\text{Einstein}\AlignFootnote{Better check this.} \\ 
    F &= mb   &&\text{Newton\AlignFootnote{This also seems wrong for some reason.}}
\end{align*}
\end{minipage}
\end{document}

实际上,脚注标记的大小不会影响公式的大小,因此更正确的答案是

\makeatletter
\newcommand{\AlignFootnote}[1]{%
  \ifmeasuring@
    \chardef\@tempfn=\value{footnote}%
    \footnotemark
    \setcounter{footnote}{\@tempfn}%
  \else
    \iffirstchoice@
      \footnote{#1}%
    \fi
  \fi}
\makeatother

仅打印脚注标记并将计数器恢复为其先前的值。

局限性如果你说\dfrac{\text{Newton\AlignFootnote{X}}}{2}你不会得到脚注。但这不应该是什么大问题。

如果你想使用该\footnote命令,这有效

\documentclass{article}
\usepackage{amsmath,etoolbox}

\makeatletter
\let\original@footnote\footnote
\newcommand{\align@footnote}[1]{%
  \ifmeasuring@
    \chardef\@tempfn=\value{footnote}%
    \footnotemark
    \setcounter{footnote}{\@tempfn}%
  \else
    \iffirstchoice@
      \original@footnote{#1}%
    \fi
  \fi}
\pretocmd{\start@align}{\let\footnote\align@footnote}{}{}
\makeatother

\begin{document}
\begin{minipage}{0.5\linewidth}
\begin{align*}
    E &= mc^3 &&\text{Einstein\footnote{Better check this.}} \\
    F &= mb   &&\text{Newton\footnote{This also seems wrong for some reason.}}
\end{align*}
\end{minipage}
\end{document}

enter image description here

笔记。上述代码仅在我们在 内部时有效minipage。对于脚注的唯一方法是使用\footnotemark\footnotetext,并进行一些调整,以免计数器前进太多次。

\documentclass{article}
\usepackage{amsmath,etoolbox}

\makeatletter
\let\original@footnotemark\footnotemark
\newcommand{\align@footnotemark}{%
  \ifmeasuring@
    \chardef\@tempfn=\value{footnote}%
    \original@footnotemark
    \setcounter{footnote}{\@tempfn}%
  \else
    \iffirstchoice@
      \original@footnotemark
    \fi
  \fi}
\pretocmd{\start@align}{\let\footnotemark\align@footnotemark}{}{}
\makeatother

\textheight=4cm % just to produce a smaller picture

\begin{document}
\begin{align*}
    E &= mc^3 &&\text{Einstein\footnotemark} \\
    F &= mb   &&\text{Newton\footnotemark}
\end{align*}
\addtocounter{footnote}{-1}
\footnotetext{Better check this.} 
\addtocounter{footnote}{1}
\footnotetext{This also seems wrong for some reason.}
\end{document}

enter image description here

答案2

代码

\documentclass{article}
\usepackage{amsmath}
\usepackage{letltxmacro}
\makeatletter
\newcommand*{\fakeFN}[1]{\@makefnmark}
\newcommand{\AlignFootnote}[1]{%
    \ifmeasuring@% I want to use \@makefnmark here, too,
                 % but \@thefnmark is undefined.
                 % The substitute "kerning" (see \else branch) is a work-around, but
                 % messes with align's spacing.
    \else%
        \footnote{#1}\sbox0{\@makefnmark}\kern-\wd0%
    \fi
}
\makeatother

\newdimen\myparboxwidth
\newcommand{\textfn}[1]{% I need to increment the fnmark counter here …
  {\LetLtxMacro\footnote\fakeFN\sbox0{#1}\global\myparboxwidth=\wd0}
  \parbox{\myparboxwidth}{#1}%
}

%\usepackage{lua-visual-debug} % for the second output
\begin{document}
\noindent\begin{minipage}{\linewidth} 
\begin{align*} 
E &= mc^3 &&\text{Einstein}\AlignFootnote{Better check this.} \\
F &= mb &&\textfn{Newton\AlignFootnote{This also seems wrong for some reason.}}
\end{align*}
\end{minipage}

\begin{align*}
E &= mc^2 &&\text{Einstein is happy now.} \\ 
F &= ma &&\text{Newton, too.}
\end{align*} 
\end{document}

输出

enter image description here

输出lua-visual-debug激活

enter image description here

相关内容