Tcolorbox - Fußnoten am Ende jeder Seite

Aug 15 2020

Ich benutze tcolorbox, um meinen Text mit einem farbigen Kästchen zu umgeben.

Es scheint, dass keine Fußnoten am Ende jeder Seite platziert werden können. Stattdessen werden sie am Ende der gesamten Box platziert. Demonstration unten:

Wie du siehst:

  1. Fußnote 1 erscheint am Ende des Feldes (weil ich es mit dem richtigen \footnote{}Befehl eingefügt habe .
  2. Fußnoten 2-4 sind gefälscht - ich manuell erstellt sie hochgestellten Indizes im Text verwendet wird , und eine Kombination aus \hrule\, der \fakefillBefehl, und das enumitemPaket.

Wie kann ich so etwas wie die 'falschen' Fußnoten erreichen, die ich mit dem Befehl \ footnote erstellt habe? Dh am Ende der entsprechenden Seite platziert (nicht am Ende der gesamten Box).

Außerdem möchte ich, dass der Fußnotentext linksbündig mit der Fußnotenregel ausgerichtet wird, ähnlich wie bei meinen gefälschten Fußnoten, und nicht eingerückt wird (wie die eigentliche Fußnote 1 am Ende).

MWE für das Bild oben:

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

Antworten

4 muzimuzhiZ Aug 17 2020 at 06:02

Standardmäßig wird der Inhalt der tcolorboxUmgebung in einer Umgebung minipage(festgelegt von capture=minipage) verarbeitet. Es ist minipagedas, was das Verhalten von ändert \footnote.

Im folgenden Beispiel emuliere ich das normale Verhalten von \footnoteby

  • Wiederherstellung des fußnotenbezogenen Zählers (von mpfootnotebis footnote) und
  • Verschieben des Einfügens auf \footins(normalerweise in \@footnotetext) bis zum Ende der ersten Schicht tcolorbox.

Derzeit werden alle \footnotein einem zerbrechlichen tcolorboxElement verwendeten s so gesetzt, als würden sie am Ende des letzten Teils verwendet.

Ähnliche Patches können ausgeführt werden minipage, aber das Schlüsselwertsystem von tcolorboxmacht den Patch weicher (weniger Notwendigkeit, interne Makros zu ändern) und leichter (kürzere Codes).

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