我怎样才能知道(编译后)脚注放在哪一页(列等),而不是段落的开头放在哪一页?
例如,在下文中,脚注 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 {}