根据页面中 \footnotemark 的位置来设置脚注

根据页面中 \footnotemark 的位置来设置脚注

我想添加一个脚注,用于引用文档后面的文本,并根据文本是在同一页(因此在脚注上方)还是在后面的页面(因此在脚注下方)显示“... 上方 ...”或“... 下方 ...”。我该怎么做?有没有办法在不手动写入辅助文件的情况下做到这一点?

(在脚注中引用未来的文本是不是不好的做法?)


我已(几乎)使用以下代码完成它:

就在脚注之前:

\制作字母
\newcommand{\IfDoAbove}{\ifdoabove\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi}
\immediate\write\@auxout{\noexpand\global\noexpand\newif\noexpand\ifsecondbulletabove}
\edef\relevantfootnotepage{\thepage}

在脚注中,\IfDoAbove{above}{below}

通过我关心的文本

\ifnum\relevantfootnotepage=\thepage\relax
  \immediate\write\@auxout{\noexpand\global\noexpand\doabovetrue}%
\别的
  \immediate\write\@auxout{\noexpand\global\noexpand\doabovefalse}%
\fi

但是,如果我关心的文本位于\item新页面上的第一项中,则它会失败;\thepage它与旧页面相同,而不是新页面。这是为什么?

答案1

在 Will Robertson 的建议下,我使以下代码基本能够正常工作(它假定脚注文本与脚注标记位于同一页面上):

\制作字母
\long\def\@firstofthree#1#2#3{#1}
\long\def\@secondofthree#1#2#3{#2}
\long\def\@thirdofthree#1#2#3{#3}
\long\def\@gobbleto@end#1\@end{}
\long\def\@@firstofmany#1{#1\@gobbleto@end}
\long\def\@firstofmany#1{\@@firstofmany#1\@end}
\long\def\@@secondofmany#1#2{#2\@gobbleto@end}
\long\def\@secondofmany#1{\@@secondofmany#1\@end}
\newcounter{如果标签在上面@计数器}
\newcommand{\numeric@pageref}[1]{% 因为 hyperref 使 \pageref 成为超链接,并且 \pageref 即使没有 hyperref,也会在末尾给我一个额外的 {}
  \expandafter\ifx\csname r@#1\endcsname\relax
    \expandafter\@firstoftwo
  \别的
    \expandafter\@secondoftwo
  \fi
  {-1}{\expandafter\@secondofmany\expandafter{\romannumeral-`\q\csname r@#1\endcsname}}%
}
\newcommand{\@branchonlabelpage}[1]{%
  \label{当前页 \arabic{iflabelabove@counter}}%
  \savebox{\@tempboxa}{\pageref{当前页面 \arabic{iflabelabove@counter}}\pageref{#1}}%
  \ifnum\numeric@pageref{#1} <\numeric@pageref{当前页 \arabic{iflabelabove@counter}}\relax%
    \stepcounter{iflabelabove@counter}\expandafter\@firstofthree
  \别的
    \ifnum\numeric@pageref{#1}=\numeric@pageref{当前页 \arabic{iflabelabove@counter}}\relax%
      \stepcounter{iflabelabove@counter}\expandafter\expandafter\expandafter\@secondofthree
    \别的
      \stepcounter{iflabelabove@counter}\expandafter\expandafter\expandafter\@thirdofthree
    \fi
  \fi
}
\newcommand{\iflabelabovepage}[3]{\@branchonlabelpage{#1}{#2}{#3}{#3}}
\newcommand{\iflabelbelowpage}[3]{\@branchonlabelpage{#1}{#3}{#3}{#2}}
\makeatother

答案2

据我所知,这是不可能的,因为 TeX 在定义脚注时会完全格式化脚注。它们存储在“等待列表中”,作为一系列完全格式化行,当 TeX 拆分页面时,他会尝试将其中的一些行放在当前页面的底部。因此,当你可能知道脚注将出现在哪一页时,再去修改它已经太晚了。

而且由于实际上甚至不可能可靠地确定脚注在哪一页,因此多遍算法不会有任何帮助......

相关内容