我想添加一个脚注,用于引用文档后面的文本,并根据文本是在同一页(因此在脚注上方)还是在后面的页面(因此在脚注下方)显示“... 上方 ...”或“... 下方 ...”。我该怎么做?有没有办法在不手动写入辅助文件的情况下做到这一点?
(在脚注中引用未来的文本是不是不好的做法?)
我已(几乎)使用以下代码完成它:
就在脚注之前:
\制作字母 \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 拆分页面时,他会尝试将其中的一些行放在当前页面的底部。因此,当你可能知道脚注将出现在哪一页时,再去修改它已经太晚了。
而且由于实际上甚至不可能可靠地确定脚注在哪一页,因此多遍算法不会有任何帮助......