Tcolorbox - сноски в конце каждой страницы

Aug 15 2020

Я использую, tcolorboxчтобы окружить свой текст цветной рамкой.

Кажется, он не может размещать сноски в конце каждой страницы. Вместо этого он помещает их в конец всей коробки. Демонстрация ниже:

Как вы видете:

  1. Сноска 1 появляется в конце поля (потому что я вставил ее с помощью правильной \footnote{}команды.
  2. Сноски 2-4 фальшивка - я вручную создал их с помощью подстрочного текста, и комбинация \hrule\, то \fakefillкоманда, и enumitemпакет.

Как я могу добиться чего-то вроде «фальшивых» сносок, которые я создал с помощью команды \ footnote? Т.е. размещается внизу соответствующей страницы (а не в конце всей коробки).

Кроме того, я бы хотел, чтобы текст сноски был выровнен по левому краю в соответствии с правилом сноски, как и мои поддельные сноски, а не с отступом (как настоящая сноска 1 в конце).

MWE для изображения выше:

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

Ответы

4 muzimuzhiZ Aug 17 2020 at 06:02

По умолчанию содержимое tcolorboxокружения обрабатывается в minipageenv (установленном capture=minipage). Это minipageменяет поведение \footnote.

В следующем примере я имитирую нормальное поведение \footnoteby

  • восстановление счетчика, относящегося к сноске (от mpfootnoteдо footnote), и
  • откладывание вставки \footins(обычно выполняется \@footnotetext) до конца первого слоя tcolorbox.

В настоящее время все \footnotes, используемые в разбиении tcolorbox, набираются так, как если бы они использовались в конце последней части.

Подобные патчи могут быть выполнены minipage, но система ключ-значение tcolorboxделает патч более мягким (меньше необходимости изменять внутренние макросы) и более легким (более короткие коды).

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