这个最小的例子有什么问题:
\documentclass{report}
\usepackage{zref-abspage}
\makeatletter
\newcounter{footdir@label}
\newtoks\footdir@toks
\newcommand*{\footdir@temp}[3]{%
\@ifdefinable{#1}{%
\let#1#2%
\renewcommand{#2}[1]{%
\footdir@toks{##1}%
\footdir@toks\expandafter{%
\the\expandafter\footdir@toks
\expandafter
\zref@labelbyprops\expandafter{\thefootdir@label}{abspage}%
}%
\expandafter#1\expandafter{\the\footdir@toks}%
}%
}%
}
\footdir@temp\footdir@ORG@footnotetext\@footnotetext{L}%
\makeatother
\begin{document}
Refer to first footnote\footnote{
Fill fill fill fill fill fill fill fill fill fill
fill fill fill fill fill fill fill fill fill fill
fill fill fill fill fill fill fill fill fill fill
fill fill fill fill fill fill fill fill fill fill
fill fill fill fill fill fill fill fill fill fill
fill fill fill fillfillfillfi.
} refer to second footnote.\footnote{Another footnote.}
\end{document}
并且\footnoterule
整个第一个脚注向上移动一个\par
?
编辑
看来该问题与宏有关,\zref@labelbyprops
而宏本身又与有关。注释掉定义中\protec@write
包含的行,问题就不会发生:\reserved@a
\protected@write
\documentclass{report}
\usepackage{zref-abspage}
\makeatletter
\long\def \protected@write#1#2#3{%
\begingroup
\let\thepage\relax
#2%
\let\protect\@unexpandable@protect
\edef\reserved@a{\write#1{#3}}%
%\reserved@a
\endgroup
\if@nobreak\ifvmode\nobreak\fi\fi
}
\newcounter{footdir@label}
\newtoks\footdir@toks
\newcommand*{\footdir@temp}[3]{%
\@ifdefinable{#1}{%
\let#1#2%
\renewcommand{#2}[1]{%
\footdir@toks{##1}%
\footdir@toks\expandafter{%
\the\expandafter\footdir@toks
\expandafter
\zref@labelbyprops{\thefootdir@label}{abspage}%
}%
\expandafter#1\expandafter{\the\footdir@toks}%
}%
}%
}
\footdir@temp\footdir@ORG@footnotetext\@footnotetext{L}%
\makeatother
\begin{document}
Refer to first footnote\footnote{
Fill fill fill fill fill fill fill fill fill fill
fill fill fill fill fill fill fill fill fill fill
fill fill fill fill fill fill fill fill fill fill
fill fill fill fill fill fill fill fill fill fill
fill fill fill fill fill fill fill fill fill fill
fill fill fill fillfillfillfi.
} refer to second footnote.\footnote{Another footnote.}
\end{document}
答案1
当 TeX 排版一个段落时,它会删除最后一行末尾的空格:例如TeX 按主题分类:
在段落的最后一个元素之后,TeX 隐式地插入了
\unskip \penalty10000 \hskip\parfillskip
使用脚注输入,例如
\footnote{
Some text.
}
结果是,在设置脚注之前,TeX 添加的行尾空格被删除了。
在您的修改版本中,文本结束后有内容。虽然它不会在输出中排版任何内容,但它会阻止\unskip
删除任何尾随空格。所以你的段落结束了
<text> <space> <zref-code>
当 TeX 排版时,如果的长度<text>
“不合适”,则添加的材料zref
将出现在新行上,因为它没有排版任何内容,因此是空的。(任何“不可见”命令总是很棘手!)
可能最明智的解决方案是添加一个\unskip
,也可能是\penalty
添加到您的代码中,例如
\newcommand*\footdir@aux{\unskip\penalty\@M}
\newcommand*{\footdir@temp}[3]{%
\@ifdefinable{#1}{%
\let#1#2%
\renewcommand{#2}[1]{%
\footdir@toks{##1}%
\footdir@toks\expandafter{%
\the\expandafter\footdir@toks
\expandafter\footdir@aux\expandafter
\zref@labelbyprops\expandafter{\thefootdir@label}{abspage}%
}%
\expandafter#1\expandafter{\the\footdir@toks}%
}%
}%
}
(我把所有添加的内容都放入一个宏中,让\expandafter
链条变得更简单一些。)
从技术层面上讲,\write
操作会添加“whatsit”:一旦将其添加到材料中,就很难/不可能执行某些操作。(LaTeX3 团队以实验形式进行的一件事是处理 whatsit 的方法,以便它们不会直接添加到“不受控制”的地方,原因就在于此。)