在脚注 100 后重新定义 \deffootnotemark

在脚注 100 后重新定义 \deffootnotemark

我正在使用该类scrreprt,并且希望将脚注定义为:

\deffootnote{2.0em}{1.5em}{\makebox[2.0em][l]{\thefootnotemark.\ }}

这种脚注样式适用于 1-99 个脚注。但是,当脚注计数器达到 100 时,脚注中没有足够的空间容纳数字。目前,我正在重新定义脚注,将\CenturyFootnote第 100 个脚注放在出现的页面上。(如果此页面上也出现较小的脚注,这是可以接受的。)

\newcommand*{\CenturyFootnote}{\deffootnote{2.4em}{1.9em}{\makebox[2.4em][r]{\thefootnotemark.\ \ }}}

但是,这意味着每当文本发生变化时,我都必须更新此命令的位置。我如何确保读取此命令就在之前至脚注达到100。

答案1

您可以向 \deffootnote 的各种参数添加测试。只要它们是可扩展的,它就应该可以正常工作:

\documentclass{scrartcl}
\usepackage{xcolor,kantlipsum}
\deffootnote{\ifnum\the\value{footnote}<100 2.0em\else 3cm\fi}
            {\ifnum\the\value{footnote}<100 2.0em\else 2cm\fi}
            {\makebox[\ifnum\the\value{footnote}<100 2.0em\else 3cm\fi][l]{\thefootnotemark.\ }}

\begin{document}
\kant[9]\footnote{\kant[9] blblblb }

\setcounter{footnote}{99}
\kant[9]\footnote{\kant[9] blblbl }


\end{document}

在此处输入图片描述

答案2

不要对脚注构造的值进行硬编码,而是将它们分配给长度。这样,您可以更改长度,并且相关的脚注标记定义也会随之更改。这类似于重新定义脚注标记定义,但不需要开销。

下面我定义了两个长度 -\fnmarkA\fnmarkB。我还重新定义了工作方式\footnote,以便根据脚注编号进行条件处理。所有脚注都以通常的方式设置,直到达到脚注编号 99。此时,\fnmarkA\fnmarkB长度会更新,并\footnote恢复原始定义(以避免由于不必要的条件而产生更多开销)。

在此处输入图片描述

\documentclass{scrreprt}

\usepackage{lipsum,xparse}

\newlength{\fnmarkA}\newlength{\fnmarkB}

\setlength{\fnmarkA}{2em}
\setlength{\fnmarkB}{1.5em}
\let\oldfootnote\footnote% Store \footnote definition
\deffootnote{\fnmarkA}{\fnmarkB}{\makebox[\fnmarkA][l]{\thefootnotemark.\ }}% < 100
\RenewDocumentCommand{\footnote}{ o m }{%
  \IfValueTF{#1}
    {\oldfootnote[#1]{#2}}% \footnote[.]{..}
    {\oldfootnote{#2}}% \footnote{..}
  \ifnum\value{footnote}=99
    \addtolength{\fnmarkA}{.5em}% Associated with \footnote 100+
    \addtolength{\fnmarkB}{.5em}% Associated with \footnote 100+
    \let\footnote\oldfootnote% Restore original footnote definition (avoid overhead)
  \fi
}


\def\x{\lipsum[2]\footnote{Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
  Proin sagittis mattis vulputate. Aliquam dignissim, nulla scelerisque hendrerit dictum, 
  enim ante molestie nulla, in fringilla massa nisi sit amet nulla.}}
\def\y{\x\x\x\x\x\x\x\x}


\begin{document}

\y\y\y\y\y\y\y\y\y\y\y\y\y\y\y\y

\end{document}

xparse仅仅因为它可以简单地管理可选参数(\footnote提供)和/或条件化它们的存在/使用。

答案3

修改\footnote对脚注编号进行检查:如果是99,则发出更改。

但是,这个更改应该对 重新定义的命令进行全局作用\deffootnote,所以我们必须制作一个“全局”版本。问题是什么?如果\deffootnote在环境中发出 ,如下例所示,一旦环境结束,操作就会消失。

\documentclass{scrreprt}
\usepackage{xpatch,letltxmacro}

\deffootnote{2.0em}{1.5em}{\makebox[2.0em][l]{\thefootnotemark.\ }}

\makeatletter
\xpretocmd{\footnote}{\ifnum\value{footnote}=99 \hundredthfootnote\fi}{}{}
\LetLtxMacro\globaldeffootnote\deffootnote
\xpatchcmd{\globaldeffootnote}
  {\long\def\@makefntext}
  {\long\gdef\@makefntext}
  {}{}
\xpatchcmd{\globaldeffootnote}
  {\def\@@makefnmark}
  {\gdef\@@makefnmark}
  {}{}
\newcommand*{\hundredthfootnote}{%
  \globaldeffootnote{2.4em}{1.9em}{\makebox[2.4em][r]{\thefootnotemark.\ \ }}%
}
\makeatother

\textheight=4cm % just for making the picture

\begin{document}

\setcounter{footnote}{98}

x\footnote{Normal footnote}

\begin{itemize}
\item y\footnote{Hundredth footnote}
\end{itemize}

z\footnote{Another}

\end{document}

在此处输入图片描述

相关内容