似乎不是\footnote
应该按照这个恰当命名的问题在数学模式下使用:数学模式下的脚注。但是,看来我可以让它工作,而不必诉诸\footnotemark
和\footnotetext
,只要我使用minipage
:
\begin{minipage}{0.5\linewidth}
\begin{align*}
E &= mc^3 &&\text{Einstein}\footnote{Better check this.}
\end{align*}
\end{minipage}
得出的结果是:
好的,看来这是可行的。
但是等一下……文本\footnote
重复了!!!嗯,一定是对齐经过了测量阶段。好的,那么应该很容易修复:我们需要做的就是检查\ifmeasuring@
:
\makeatletter
\newcommand{\AlignFootnote}[1]{%
\ifmeasuring@
\else
\footnote{#1}%
\fi
}
\makeatother
现在使用\AlignFootnote{}
而不是\footnote{}
我们得到期望的结果:
好的,但在第一个用例(爱因斯坦)中,我恰好在\footnote
里面使用了\text{}
。尝试\AlignFootnote{}
在外面使用\text{}
(牛顿)确实会因为某种原因搞砸这件事:
因此在牛顿用例中,看起来好像外部的内容\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}
笔记。上述代码仅在我们在 内部时有效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}
答案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}