
Según tengo entendido (corríjame si me equivoco), una desventaja de las clases de tufte es que las notas al margen no pueden cruzar un salto de página. Las notas al margen deben terminar en la misma página donde comienzan.
Me di cuenta de que una versión bastante actual de KOMA-Script incluye un paquete scrlayer-notecolumn
que resuelve este problema: podemos tener notas al margen independientemente de los saltos de página.
Las notas al margen incluso funcionan dentro de flotantes, pero la numeración de las notas al margen es un problema en ese caso.
Podemos tener tablas y figuras en el margen, pero cada comando en el margen necesita un archivo \protect
.
Pregunta: ¿Cómo escribir un entorno margintabular
como en las clases de tufte? ¿Qué más necesitamos para mejorar los documentos estilo Tufte con el scrlayer-notecolumn
paquete?
\documentclass{scrartcl}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{scrlayer-scrpage, scrlayer-notecolumn, lmodern, blindtext,
ragged2e}
%% step 1: counter
\newcounter{snmark}
\setcounter{snmark}{0}
%% step 2: hanging sidenotes, definition from tugboat
\makeatletter
\newcommand*{\hangfrom}[1]{%
\setbox\@tempboxa\hbox{{#1}}%
\hangindent \wd\@tempboxa
\noindent\box\@tempboxa}
\makeatletter
%% step 3: define sidenote marks in the text
\newcommand{\makesidenotemark}{%
\textsuperscript{\thesnmark}
}%
%% step 4: and now the definition of sidenotes
\newcommand{\sidenote}[1]{%
\refstepcounter{snmark}% Zähler erhöhen
\makesidenotemark{}% Nummer im Text setzen.
\makenote[paragraphs]{%
\hangfrom{%
\makebox[1em][l]{%
\thesnmark}
}
\protect\RaggedRight{} #1}% Text setzen im Rand
}
%% this is, except for the values (».7«) from scrguide.pdf to define
%% the notecolumn.
\newlength{\paragraphscolwidth}
\AfterCalculatingTypearea{%
\setlength{\paragraphscolwidth}{.4\textwidth}%
\addtolength{\paragraphscolwidth}{-\marginparsep}%
}
\recalctypearea
\DeclareNewNoteColumn[%
position=\oddsidemargin+1in
+.7\textwidth
+\marginparsep,
width=\paragraphscolwidth,
font=\footnotesize
]{paragraphs}
%% Delete all sidenotes:
%\renewcommand{\sidenote}[1]{\relax}
\begin{document}
\begin{addmargin}[0pt]{.3\textwidth}
This is the text with a \sidenote{See here.\blindtext}.
\blindtext
And here we have a second paragraph and a second
sidenote\sidenote{\blindtext}.
\blindtext
And this is the big hit: We can have sidenotes which include
pagebreaks!\sidenote{Proof of concept: \blindtext{}}
\syncwithnotecolumns[paragraphs]
And now we somewhere have a table:
\begin{table}[b]
\centering
\begin{tabular}{ll}
Proof\sidenote{From inside the float} & of concept\\
\end{tabular}
\caption{This is a table}
\label{tab:table}
\end{table}
Besides that, we even can have tabulars in the margin\sidenote{%
Tabular in the margin:
\protect\begin{tabular}{|l|l|}\protect\hline
a& b\\\protect\hline
a& b\\\protect\hline
a& b\\\protect\hline
\protect\end{tabular}
}, but they have
to be narrow and well protected.
\end{addmargin}
\end{document}
Respuesta1
Para tener tablas dentro de la nota al margen, puede crear una especie de entorno de tabla no flotante, por ejemplo
\usepackage{environ}
\makeatletter
\NewEnviron{margintable}{%
\expandafter\@margintable\expandafter{\BODY}%
}
\newcommand*\@margintable[1]{%
\makenote[paragraphs]{%
\protect\begin{nonfloattable}\detokenize{#1}\protect\end{nonfloattable}
}%
}
\newenvironment{nonfloattable}{%
\par\noindent\begin{minipage}{\linewidth}
\def\@captype{table}%
}{%
\end{minipage}\par
}
Pero hay un problema: parece que escribir una etiqueta en el aux
archivo desde una nota no funciona, por lo que \label{tab:secondtable}
dentro de un margintable
entorno no se generaría una etiqueta.
Extraño: escribir el título en el aux
archivo funciona.
Actualmente no sé por qué escribir la etiqueta en el aux
archivo no funciona, pero escribir la lot
entrada en el aux
archivo sí funciona. Sin embargo, podrías usar un truco para escribir la información de la etiqueta en el aux
archivo - cuando lo uses margintable
en lugar de cuando hagas la nota:
\documentclass{scrartcl}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{scrlayer-scrpage, scrlayer-notecolumn, lmodern, blindtext,
ragged2e}
%% step 1: counter
\newcounter{snmark}
\setcounter{snmark}{0}
%% step 2: hanging sidenotes, definition from tugboat
\makeatletter
\newcommand*{\hangfrom}[1]{%
\setbox\@tempboxa\hbox{{#1}}%
\hangindent \wd\@tempboxa
\noindent\box\@tempboxa}
\makeatletter
%% step 3: define sidenote marks in the text
\newcommand{\makesidenotemark}{%
\textsuperscript{\thesnmark}
}%
%% step 4: and now the definition of sidenotes
\newcommand{\sidenote}[1]{%
\refstepcounter{snmark}% Zähler erhöhen
\makesidenotemark{}% Nummer im Text setzen.
\makenote[paragraphs]{%
\hangfrom{%
\makebox[1em][l]{%
\thesnmark}
}
\protect\RaggedRight{} #1}% Text setzen im Rand
}
%% this is, except for the values (».7«) from scrguide.pdf to define
%% the notecolumn.
\newlength{\paragraphscolwidth}
\AfterCalculatingTypearea{%
\setlength{\paragraphscolwidth}{.4\textwidth}%
\addtolength{\paragraphscolwidth}{-\marginparsep}%
}
\recalctypearea
\DeclareNewNoteColumn[%
position=\oddsidemargin+1in
+.7\textwidth
+\marginparsep,
width=\paragraphscolwidth,
font=\footnotesize
]{paragraphs}
\usepackage{environ}
\makeatletter
\NewEnviron{margintable}{%
\expandafter\@margintable\expandafter{\BODY}%
}
\newcommand*\@margintable[1]{%
\global\let\labeltoset\@empty
\@tempcnta\value{table}%
\begin{lrbox}{\@tempboxa}
\begin{minipage}{\paragraphscolwidth}
\def\label##1{%
\xdef\labeltoset{%
\labeltoset
\noexpand\protected@write\noexpand\@auxout{}{%
\noexpand\string\noexpand\newlabel{##1}{{\@currentlabel}{\thepage}}}%
}%
}%
\def\@captype{table}%
#1%
\end{minipage}
\end{lrbox}%
\setcounter{table}{\@tempcnta}%
\makenote[paragraphs]{%
\protect\begin{nonfloattable}\detokenize{#1}\protect\end{nonfloattable}
}%
\labeltoset
}
\newenvironment{nonfloattable}{%
\par\noindent\begin{minipage}{\linewidth}
\def\@captype{table}%
}{%
\end{minipage}\par
}
%% Delete all sidenotes:
%\renewcommand{\sidenote}[1]{\relax}
\begin{document}
\begin{addmargin}[0pt]{.3\textwidth}
This is the text with a \sidenote{See here.\blindtext}.
\blindtext
And here we have a second paragraph and a second
sidenote\sidenote{\blindtext}.
\blindtext
And this is the big hit: We can have sidenotes which include
pagebreaks!\sidenote{Proof of concept: \blindtext{}}
\syncwithnotecolumns[paragraphs]
And now we somewhere have a table:
\begin{table}[b]
\centering
\begin{tabular}{ll}
Proof\sidenote{From inside the float} & of concept\\
\end{tabular}
\caption{This is a table}
\label{tab:table}
\end{table}
Besides that, we even can have tabulars in the margin\sidenote{%
Tabular in the margin:
\protect\begin{tabular}{|l|l|}\protect\hline
a& b\\\protect\hline
a& b\\\protect\hline
a& b\\\protect\hline
\protect\end{tabular}
}, but they have
to be narrow and well protected.
\begin{margintable}
\centering
\begin{tabular}{|l|l|}\hline
a& b\\\hline
a& b\\\hline
a& b\\\hline
\end{tabular}
\caption{This is a second table}%
\label{tab:secondtable}
\end{margintable}
See also table~\ref{tab:secondtable}.
\end{addmargin}
\listoftables
\end{document}
Pero tenga en cuenta que todavía hay un problema: el número de página de la etiqueta será incorrecto si la nota pasa a otra página.
Actualización: Desde scrlayer-notecolumn
0.1.2583 deKOMA-Script 3.23.2583 \label
en notas funciona como se esperaba. Y con lo nuevo ya \makenote*
no necesitas todo esto . \protect
Entonces lo siguiente funciona:
\documentclass{scrartcl}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{scrlayer-scrpage, scrlayer-notecolumn, lmodern, blindtext,
ragged2e}
%% step 1: counter
\newcounter{snmark}
\setcounter{snmark}{0}
%% step 2: hanging sidenotes, definition from tugboat
\makeatletter
\newcommand*{\hangfrom}[1]{%
\setbox\@tempboxa\hbox{{#1}}%
\hangindent \wd\@tempboxa
\noindent\box\@tempboxa}
\makeatletter
%% step 3: define sidenote marks in the text
\newcommand{\makesidenotemark}{%
\textsuperscript{\thesnmark}%
}%
%% step 4: and now the definition of sidenotes
\newcommand{\sidenote}[1]{%
\refstepcounter{snmark}% Zähler erhöhen
\makesidenotemark{}% Nummer im Text setzen.
\makenote[paragraphs]{%
\hangfrom{%
\makebox[1em][l]{%
\thesnmark}%
}%
\protect\RaggedRight\detokenize{#1}}% Text setzen im Rand
}
%% this is, except for the values (».7«) from scrguide.pdf to define
%% the notecolumn.
\newlength{\paragraphscolwidth}
\AfterCalculatingTypearea{%
\setlength{\paragraphscolwidth}{.4\textwidth}%
\addtolength{\paragraphscolwidth}{-\marginparsep}%
}
\recalctypearea
\DeclareNewNoteColumn[%
position=\oddsidemargin+1in
+.7\textwidth
+\marginparsep,
width=\paragraphscolwidth,
font=\footnotesize
]{paragraphs}
\usepackage{environ}
\makeatletter
\NewEnviron{margintable}{%
\expandafter\@margintable\expandafter{\BODY}%
}
\newcommand*\@margintable[1]{%
\makenote*[paragraphs]{%
\begin{nonfloattable}#1\end{nonfloattable}%
}%
}
\newenvironment{nonfloattable}{%
\par\noindent\begin{minipage}{\linewidth}
\def\@captype{table}%
}{%
\end{minipage}\par
}
\usepackage{makeidx}
%% Delete all sidenotes:
%\renewcommand{\sidenote}[1]{\relax}
\begin{document}
\begin{addmargin}[0pt]{.3\textwidth}
This is the text with a sidenote\sidenote{See here.\blindtext}.
\blindtext
And here we have a second paragraph and a second
sidenote\sidenote{\blindtext}.
\blindtext
And this is the big hit: We can have sidenotes which include
pagebreaks!\sidenote{Proof of concept: \blindtext{}}
\syncwithnotecolumns[paragraphs]
And now we somewhere have a table:
\begin{table}[b]
\centering
\begin{tabular}{ll}
Proof\sidenote{From inside the float} & of concept\\
\end{tabular}
\caption{This is a table}
\label{tab:table}
\end{table}
Besides that, we even can have tabulars in the margin\sidenote{%
Tabular in the margin:
\begin{tabular}{|l|l|}\hline
a& b\\\hline
a& b\\\hline
a& b\\\hline
\end{tabular}%
}, but they have
to be narrow and well protected.
\begin{margintable}
\centering
\begin{tabular}{|l|l|}\hline
a& b\\\hline
a& b\\\hline
a& b\\\hline
\end{tabular}
\caption{This is a second table}%
\label{tab:secondtable}
\end{margintable}
See also table~\ref{tab:secondtable}.
\listoftables
\end{addmargin}
\end{document}
Porque \sidenote
no puede utilizar \makenote*
, porque \thesnmark
debe ampliarse inmediatamente. Pero puedes usar el \detokenize
truco \makenote*
tú mismo como se muestra en el ejemplo anterior.
Por cierto: en el código anterior he corregido varios errores de espacio.