编辑

编辑

这个最小的例子有什么问题:

\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 的方法,以便它们不会直接添加到“不受控制”的地方,原因就在于此。)

相关内容