Tcolorbox - notas de rodapé no final de cada página
Estou usando tcolorbox
para 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:
- A nota de rodapé 1 aparece no final da caixa (porque eu a inseri usando o
\footnote{}
comando adequado . - Notas de rodapé 2-4 são falsos - Eu criei-los manualmente usando sobrescritos no texto, e uma combinação de
\hrule\
, o\fakefill
comando e oenumitem
pacote.
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
Por padrão, o conteúdo do tcolorbox
ambiente é processado em um minipage
env (definido por capture=minipage
). É minipage
isso que muda o comportamento de \footnote
.
No exemplo a seguir, que emulam o comportamento normal de \footnote
pela
- restaurar o contador relacionado à nota de rodapé (de
mpfootnote
parafootnote
) e - adiar a inserção
\footins
(normalmente feito em\@footnotetext
) até o final da primeira camadatcolorbox
.
Atualmente, todos os \footnote
s usados em um quebrável tcolorbox
são compostos como se fossem usados no final da última parte.
Patches semelhantes podem ser feitos minipage
, mas o sistema de valores-chave tcolorbox
torna 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}