Tcolorbox - notas al pie de página al final de cada página

Aug 15 2020

Estoy usando tcolorboxpara rodear mi texto con un cuadro de color.

Parece que no puede colocar notas al pie de página al final de cada página. En cambio, los coloca al final de toda la caja. Demostración a continuación:

Como puedes ver:

  1. La nota al pie 1 aparece al final del cuadro (porque la inserté usando el \footnote{}comando adecuado .
  2. Notas al pie 2-4 son falsos - He creado manualmente utilizando superíndices en el texto, y una combinación de \hrule\, al \fakefillmando, y el enumitempaquete.

¿Cómo puedo lograr algo como las notas al pie 'falsas' que creé con el comando \ footnote? Es decir, se coloca en la parte inferior de la página correspondiente (no al final de todo el cuadro).

Además, me gustaría que el texto de la nota al pie esté alineado a la izquierda con la regla de la nota al pie, similar a mis notas al pie falsas, en lugar de sangrar (como la nota al pie 1 real al final).

MWE para la imagen de arriba:

\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}

Respuestas

4 muzimuzhiZ Aug 17 2020 at 06:02

De forma predeterminada, el contenido del tcolorboxentorno se procesa en un minipageenv (establecido por capture=minipage). Es lo minipageque cambia el comportamiento de \footnote.

En el siguiente ejemplo, emulo el comportamiento normal de \footnotepor

  • restaurar el contador relacionado con la nota al pie (de mpfootnotea footnote), y
  • posponer la inserción a \footins(normalmente hecha en \@footnotetext) hasta el final de la primera capa tcolorbox.

Actualmente, todos los \footnotemensajes de texto usados ​​en un rompible tcolorboxse componen como si se usaran al final de la última parte.

Se pueden hacer parches similares minipage, pero el sistema de clave-valor tcolorboxhace que el parche sea más suave (menos necesidad de modificar macros internas) y más ligero (códigos más cortos).

\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}