确定所有脚注位于哪一页

确定所有脚注位于哪一页

我怎样才能知道(编译后)脚注放在哪一页(列等),而不是段落的开头放在哪一页?

例如,在下文中,脚注 7 位于第 2 页;然而,在 中\jobname.feet,第 7 行却7.p1是 ,而它“应该”是7.p2

\documentclass{scrartcl}

\usepackage{lipsum}
\def\lipf{\lipsum*[1]\footnote{aa}\par zz\footnote{bb}}

\newwrite\feet
\immediate\openout\feet=\jobname.feet

\deffootnote{1em}{2em}{\immediate\write\feet{\thefootnote.p\thepage}}

\begin{document}
\lipf\lipf\lipf\lipf
\end{document}

我知道我“应该”用它\pageref来指代出现标签的真实页面,但我不知道如何将其添加到每个脚注中,或者如何将此信息写入文本文件。

作为背景,我正在强制执行一种\deffootnote在第 100 个脚注的页面上进行更改的样式,为此我需要编写一个文件来确认更改是否正确放置。

答案1

您可以添加自动标签到\footnote(更准确地说,到\@footnotetext)。

\documentclass{scrartcl}
\usepackage{etoolbox}

\usepackage{lipsum}

\makeatletter
\patchcmd{\@footnotetext}
  {#1}
  {#1\label{footnote@@@\thefootnote}}
  {}{}
\makeatother


\def\lipf{\lipsum*[1]\footnote{aa}\par zz\footnote{bb}}

\begin{document}
\lipf\lipf\lipf\lipf
\end{document}

.aux以下是与脚注相关的文件内容:

\newlabel{footnote@@@1}{{1}{1}}
\newlabel{footnote@@@2}{{2}{1}}
\newlabel{footnote@@@3}{{3}{1}}
\newlabel{footnote@@@4}{{4}{1}}
\newlabel{footnote@@@5}{{5}{1}}
\newlabel{footnote@@@6}{{6}{1}}
\newlabel{footnote@@@7}{{7}{2}}
\newlabel{footnote@@@8}{{8}{2}}

除了编写\newlabel命令之外,还可以写出其他内容以便在最终文档中进一步处理,类似于\addcontentsline工作原理。

使用hyperref宏进行修补有所不同;无论有没有它,下面的代码都可以工作。

\documentclass{scrartcl}
\usepackage{etoolbox}
\usepackage{hyperref}

\usepackage{lipsum}

\makeatletter
\@ifpackageloaded{hyperref}
 {\patchcmd{\H@@footnotetext}}
 {\patchcmd{\@footnotetext}}
  {#1}
  {#1\label{footnote@@@\thefootnote}}
  {}{}
\makeatother


\def\lipf{\lipsum*[1]\footnote{aa}\par zz\footnote{bb}}

\begin{document}
\lipf\lipf\lipf\lipf
\end{document}

在双列格式下,也可以借助来存储列zref-savepos

\documentclass[twocolumn]{scrartcl}
\usepackage{etoolbox}
\usepackage{zref-savepos}
\usepackage{hyperref}

\usepackage{lipsum}

\makeatletter
\@ifpackageloaded{hyperref}
 {\patchcmd{\H@@footnotetext}}
 {\patchcmd{\@footnotetext}}
  {#1}
  {\zsaveposx{footnote@@@\thefootnote}#1\label{footnote@@@\thefootnote}}
  {}{}
\makeatother


\def\lipf{\lipsum*[1]\footnote{aa}\par zz\footnote{bb}}

\begin{document}
\lipf\lipf\lipf\lipf
\end{document}

文件中相应的输出.aux如下,可以清楚地看到左栏中是什么脚注,右栏中是什么脚注。

\zref@newlabel{footnote@@@1}{\posx{6479946}}
\newlabel{footnote@@@1}{{1}{1}{}{Hfootnote.1}{}}
\zref@newlabel{footnote@@@2}{\posx{6479946}}
\newlabel{footnote@@@2}{{2}{1}{}{Hfootnote.2}{}}
\zref@newlabel{footnote@@@3}{\posx{20513024}}
\newlabel{footnote@@@3}{{3}{1}{}{Hfootnote.3}{}}
\zref@newlabel{footnote@@@4}{\posx{20513024}}
\newlabel{footnote@@@4}{{4}{1}{}{Hfootnote.4}{}}
\zref@newlabel{footnote@@@5}{\posx{20513024}}
\newlabel{footnote@@@5}{{5}{1}{}{Hfootnote.5}{}}
\zref@newlabel{footnote@@@6}{\posx{20513024}}
\newlabel{footnote@@@6}{{6}{1}{}{Hfootnote.6}{}}
\zref@newlabel{footnote@@@7}{\posx{6479946}}
\newlabel{footnote@@@7}{{7}{2}{}{Hfootnote.7}{}}
\zref@newlabel{footnote@@@8}{\posx{6479946}}
\newlabel{footnote@@@8}{{8}{2}{}{Hfootnote.8}{}}

答案2

这从技术上回答了这个问题,但也增加了一些\hbox{}问题,.feet因为我不知道自己在做什么。

\documentclass{scrartcl}
\usepackage{lipsum}
\newcommand*\lipf{\lipsum*[1]\footnote{aa}\par zz\footnote{bb}}

\newwrite\feet
\immediate\openout\feet=\jobname.feet

\deffootnote{1em}{2em}{\textsuperscript{\thefootnotemark}\label{fn:\thefootnote}\immediate\write\feet{\ref{fn:\thefootnote}.p\pageref{fn:\thefootnote}}}

\begin{document}
\lipf\lipf\lipf\lipf
\end{document}

.feet

1\hbox {}.p1\hbox {}
2\hbox {}.p1\hbox {}
3\hbox {}.p1\hbox {}
4\hbox {}.p1\hbox {}
5\hbox {}.p1\hbox {}
6\hbox {}.p1\hbox {}
7\hbox {}.p2\hbox {}
8\hbox {}.p2\hbox {}

相关内容