我正在使用该类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}