Tcolorbox - notas de rodapé no final de cada página

Aug 15 2020

Estou usando tcolorboxpara cercar meu texto com uma caixa colorida.

Parece que não pode colocar notas de rodapé no final de cada página. Em vez disso, ele os coloca no final da caixa inteira. Demonstração abaixo:

Como você pode ver:

  1. A nota de rodapé 1 aparece no final da caixa (porque eu a inseri usando o \footnote{}comando adequado .
  2. Notas de rodapé 2-4 são falsos - Eu criei-los manualmente usando sobrescritos no texto, e uma combinação de \hrule\, o \fakefillcomando e o enumitempacote.

Como posso conseguir algo como as notas de rodapé 'falsas' que criei com o comando \ footnote? Ou seja, colocado na parte inferior da página relevante (não no final da caixa inteira).

Além disso, gostaria que o texto da nota de rodapé fosse alinhado à esquerda com a regra da nota de rodapé, semelhante às minhas notas de rodapé falsas, em vez de recuado (como a nota de rodapé 1 real no final).

MWE para a imagem acima:

\documentclass[12pt]{article}

% look of the page
\usepackage[margin=0.8in, top = 1.3in, bottom = 1.3in, headheight = 0.6in]{geometry}
\usepackage{lmodern}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{fancyhdr}
\renewcommand{\headrulewidth}{0pt}
\setlength{\footskip}{50pt}
\setlength{\footnotesep}{\baselineskip} % space between footnotes 
\setlength{\parindent}{0pt} % space at start of paragraph
\setlength{\parskip}{0.14in} % space between paragraphs

% math
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{amsthm}

% relevant to this question
\usepackage{enumitem} 
\usepackage[many]{tcolorbox}
\usepackage{xcolor}
\newcommand*{\fakebreak}{\par\vspace{\textheight minus \textheight}\pagebreak}
\newcommand*{\fakefill}{\par\vspace{\textheight minus \textheight}}

\begin{document}

\begin{tcolorbox}[%
parbox = false,
colback = white, colframe = black,
left = 0.5in, right = 0.5in, top = 0.4in, bottom = 0.4in,
height = 9.06in,
sharp corners,
boxrule = 1pt,
breakable,
]

\renewcommand{\thempfootnote}{\arabic{mpfootnote}}

First sentence.\footnote{Footnote 1.} \\
Second sentence.$^2$

\fakefill

\par\noindent\rule{0.3\textwidth}{0.4pt}
{\footnotesize
\begin{enumerate}[leftmargin = 0in, rightmargin = 0in, topsep = 0pt]
\item[$^2$] Footnote 2.
\end{enumerate}
}

\newpage

Third sentence.$^3$\\
Fourth sentence.$^4$

\fakefill

\par\noindent\rule{0.3\textwidth}{0.4pt}
{\footnotesize
\begin{enumerate}[leftmargin = 0in, rightmargin = 0in, topsep = 0pt]
\item[$^3$] Footnote 3.
\item[$^4$] Footnote 4.
\end{enumerate}
} 

\end{tcolorbox}

\end{document}

Respostas

4 muzimuzhiZ Aug 17 2020 at 06:02

Por padrão, o conteúdo do tcolorboxambiente é processado em um minipageenv (definido por capture=minipage). É minipageisso que muda o comportamento de \footnote.

No exemplo a seguir, que emulam o comportamento normal de \footnotepela

  • restaurar o contador relacionado à nota de rodapé (de mpfootnotepara footnote) e
  • adiar a inserção \footins(normalmente feito em \@footnotetext) até o final da primeira camada tcolorbox.

Atualmente, todos os \footnotes usados ​​em um quebrável tcolorboxsão compostos como se fossem usados ​​no final da última parte.

Patches semelhantes podem ser feitos minipage, mas o sistema de valores-chave tcolorboxtorna o patch mais suave (menos necessidade de modificar macros internas) e mais leve (códigos mais curtos).

\documentclass{article}
\usepackage[papersize={10cm, 15cm}]{geometry}
\usepackage{lipsum}
\usepackage[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}
text\footnote{first}

\begin{tcolorbox}
  content\footnote{inside tcolorbox}\par  
  footnote with optional argument\footnote[10]{inside tcolorbox 2}
\end{tcolorbox}

text\footnote{third}

\begin{tcolorbox}
  content\footnote{inside second tcolorbox}\par  
  footnote with optional argument\footnote[20]{inside second tcolorbox 2}
  \begin{tcolorbox}
    content\footnote{layer 2}
    \begin{tcolorbox}
      content\footnote{layer 3}
    \end{tcolorbox}
  \end{tcolorbox}
\end{tcolorbox}

text\footnote{seventh}
\end{document}