tcolorbox 中的脚注不在脚注标记的页面中

tcolorbox 中的脚注不在脚注标记的页面中

我在某些 tcolorbox 中的一些脚注方面遇到了这个问题。我希望将脚注显示在脚注标记所在的页面底部。显然,当 tcolorbox 很长并且分成 2 或 3 页时(它们是可拆分的 tcolorbox),很难实现这一点。这个问题与

用垂直条或背景装饰环境,但保留脚注的默认行为(即正确页面上的文本)

(首先我想对这篇文章发表评论,但我太“新手”了,无法这样做(需要一些声誉点......))。

显然问题的核心在于放置浮点数的 LaTeX 算法,从以下帖子中人们可能会认为我的问题没有解决方案。

\tcolorbox: 页面上的脚注

然而,几年后,我想知道是否有人可以找到一种 TeX 补丁来按照要求放置脚注,例如使它们比其他类型的浮动对象具有某种优先级?

其他类似问题: tcolorbox 环境中的脚注

我在前言中提到的 tex 补丁是在这个论坛上找到的(Tcolorbox-每页末尾都有脚注) 使 tcolorbox 里面的脚注看起来就像普通的脚注一样,也就是说在 tcolorbox 外面。

任何想法?

问候,埃里克

\documentclass[12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[ % Define your margins here
    a4paper,
    left=2.5cm,
    right=2.5cm,
    bottom=2.5cm,
    textheight=650pt,
    footskip=50pt
    ]{geometry}

\usepackage{lipsum,changepage}
\usepackage[breakable,hooks]{tcolorbox}

\makeatletter
% restore footnote internals to those in normal page, not minipage
\def\tcb@restore@footnote{%
  \def\@mpfn{footnote}%
  \def\thempfn{\arabic{footnote}}%
  \let\@footnotetext\tcb@footnote@collect
}

% collect footnote text
\long\def\tcb@footnote@collect#1{%
  % expand \@thefnmark before appending before app to \tcb@footnote@acc
  \expandafter\gappto\expandafter\tcb@footnote@acc\expandafter{%
    \expandafter\footnotetext\expandafter[\@thefnmark]{#1}%
  }%
}

\def\tcb@footnote@use{%
  \tcb@footnote@acc
  \global\let\tcb@footnote@acc\@empty
}
\global\let\tcb@footnote@acc\@empty

\tcbset{
  % restore for every box
  every box/.style={
    before upper pre=\tcb@restore@footnote
  },
  % use for layer 1 boxes only
  every box on layer 1/.append style={
    after app=\tcb@footnote@use
  }
}
\makeatother

\begin{document}

\begin{tcolorbox}[breakable,
                  colback=blue!7!white,
                  colframe=blue!75!black,
                  title=Protocole détaillé:
                 ]

\lipsum[1-4]
Nous avons mis en suspension 
   le pellet\footnote{Egalement appelé culot en français, il correspond au fond 
  du tube dans lequel les diatomées se sont agglomérées.} 
  \lipsum[1-1]
 Nous avons ensuite introduit le contenu dans des tubes à cryogénisation pour faire 
 un shock freeze\footnote{Méthode qui consiste à plonger brusquement les tubes 
 dans de l'azote liquide afin de détériorer les membranes.}. 
Nous avons ajouté ensuite du $\beta$-mercaptoéthanol et 
du Tween qui servent à lyser\footnote{Ouvrir, voire détruire les membranes des cellules.} 
\lipsum[1-5]
\end{tcolorbox}

\end{document}

答案1

这会将脚注写入辅助文件,因此需要两次传递。在每一页的末尾,它会检查下一页上是否有脚注,并将其添加到队列中。它们可能与正常脚注(tcolorbox 之外)的顺序不一致。

另一个可能的问题是,如果脚注放在页面底部附近,在这种情况下,脚注及其标记将循环,永远不会在同一页上。使用单独的 \footnotemark 和 \footnotetext 来强制放置。

\documentclass[12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[ % Define your margins here
    a4paper,
    left=2.5cm,
    right=2.5cm,
    bottom=2.5cm,
    textheight=650pt,
    footskip=50pt
    ]{geometry}

\usepackage{lipsum,changepage}
\usepackage[breakable,hooks]{tcolorbox}

\newif\iffootaux
\newcounter{footaux}% for \csname
\newcounter{auxpage}% to handle frontmatter etc.
\setcounter{auxpage}{1}

\makeatletter
\tcbset{every box/.style={before upper app=\tcb@footnote@setup}}

\def\tcb@footnote@setup{\let\footnotetext=\footaux
  \let\footnote=\footnoteaux}
  
\def\footnoteaux{\@ifnextchar[\@xfootnoteaux{\stepcounter{footnote}%
  \footnotemark[\thefootnote]\@footaux[\thefootnote]}}
  
\def\@xfootnoteaux[#1]{\footnotemark[#1]\@footaux[#1]}

\def\footaux{\@ifnextchar[\@footaux{\@footaux[\thefootnote]}}
\def\@footaux[#1]#2{\protected@write{\@auxout}{\let\theauxpage\relax}{\string\newfootnote{\theauxpage}{#1}{#2}}}

\newcommand{\newfootnote}[3]{% #1 = \theauxpage, #2 = \thefoontnote, #3 = text
  \ifnum#1=1\relax
    \footnotetext[#2]{#3}%
  \else
    \stepcounter{footaux}%
    \expandafter\xdef\csname footauxpage\thefootaux\endcsname{#1}%
    \expandafter\xdef\csname footauxnumber\thefootaux\endcsname{#2}%
    \expandafter\protected@xdef\csname footauxtext\thefootaux\endcsname{#3}%
  \fi}

% to run at the end of every page (debug version)
\newcommand{\addfootaux}{\loop
  \@ifundefined{footauxpage\thefootaux}{\footauxfalse}{%
    \count1=\csname footauxpage\thefootaux\endcsname\relax
    \advance\count1 by -1
    \ifnum\count1=\value{auxpage}%
      \expandafter\let\expandafter\footauxnumber\csname footauxnumber\thefootaux\endcsname
      \expandafter\let\expandafter\footauxtext\csname footauxtext\thefootaux\endcsname
      \footnotetext[\footauxnumber]{\footauxtext}%
      \footauxtrue
    \else
      \footauxfalse
    \fi}
  \iffootaux
    \global\expandafter\let\csname footauxpage\thefootaux\endcsname\relax
    \global\expandafter\let\csname footauxnumber\thefootaux\endcsname\relax
    \global\expandafter\let\csname footauxtext\thefootaux\endcsname\relax
    \stepcounter{footaux}%
  \repeat
\stepcounter{auxpage}}
\makeatother

\AtBeginDocument{\setcounter{footaux}{1}}% reset counter after \newfootnote
\AddToHook{shipout/after}{\addfootaux}

\begin{document}

\begin{tcolorbox}[breakable,
                  colback=blue!7!white,
                  colframe=blue!75!black,
                  title=Protocole détaillé:
                 ]
\let\footnotetext=\footaux
\lipsum[1-4]
Nous avons mis en suspension 
   le pellet\footnote{Egalement appelé culot en français, il correspond au fond 
  du tube dans lequel les diatomées se sont agglomérées.} 
  \lipsum[1-1]
 Nous avons ensuite introduit le contenu dans des tubes à cryogénisation pour faire 
 un shock freeze\footnote{Méthode qui consiste à plonger brusquement les tubes 
 dans de l'azote liquide afin de détériorer les membranes.}. 
Nous avons ajouté ensuite du $\beta$-mercaptoéthanol et 
du Tween qui servent à lyser\footnote{Ouvrir, voire détruire les membranes des cellules.} 
\lipsum[1-5]
\end{tcolorbox}

\end{document}

相关内容