Tcolorbox - przypisy na końcu każdej strony

Aug 15 2020

Używam, tcolorboxaby otoczyć mój tekst kolorową ramką.

Wydaje się, że nie może umieszczać przypisów na końcu każdej strony. Zamiast tego umieszcza je na końcu całego pudełka. Demonstracja poniżej:

Jak widzisz:

  1. Przypis 1 pojawia się na końcu pudełka (ponieważ wstawiłem go za pomocą odpowiedniego \footnote{}polecenia.
  2. Przypisy 2-4 są fałszywe - ręcznie tworzone je za pomocą indeksu górnego w tekście, a kombinacja \hrule\The \fakefillpoleceń, a enumitempakiet.

Jak mogę uzyskać coś takiego jak „fałszywe” przypisy, które utworzyłem za pomocą polecenia \ footnote? Tj. Umieszczony na dole odpowiedniej strony (nie na końcu całego pola).

Ponadto chciałbym, aby tekst przypisu był wyrównany do lewej z regułą przypisu, podobnie jak moje fałszywe przypisy, a nie wcięty (jak rzeczywisty przypis 1 na końcu).

MWE na zdjęciu powyżej:

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

Odpowiedzi

4 muzimuzhiZ Aug 17 2020 at 06:02

Domyślnie zawartość tcolorboxśrodowiska jest przetwarzana w pliku minipageenv (ustawionym przez capture=minipage). To minipagezmienia zachowanie \footnote.

W poniższym przykładzie naśladuję normalne zachowanie \footnoteby

  • przywracanie licznika związanego z przypisami (od mpfootnotedo footnote) oraz
  • odraczanie wstawiania \footins(zwykle gotowe \@footnotetext) do końca pierwszej warstwy tcolorbox.

Obecnie wszystkie \footnoteznaki używane w łamanym tcolorboxsą składane tak, jakby były używane na końcu ostatniej części.

Podobne łaty można zrobić na minipage, ale system klucz-wartość tcolorboxsprawia, że ​​łatka jest bardziej miękka (mniejsza potrzeba modyfikowania wewnętrznych makr) i lżejsza (krótsze kody).

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