Diseño similar a mechón con notas al margen cruzando saltos de página, o: mechón hecho con KOMA-Script

Diseño similar a mechón con notas al margen cruzando saltos de página, o: mechón hecho con KOMA-Script

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-notecolumnque 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 margintabularcomo en las clases de tufte? ¿Qué más necesitamos para mejorar los documentos estilo Tufte con el scrlayer-notecolumnpaquete?

\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 auxarchivo desde una nota no funciona, por lo que \label{tab:secondtable}dentro de un margintableentorno no se generaría una etiqueta.

Extraño: escribir el título en el auxarchivo funciona.

Actualmente no sé por qué escribir la etiqueta en el auxarchivo no funciona, pero escribir la lotentrada en el auxarchivo sí funciona. Sin embargo, podrías usar un truco para escribir la información de la etiqueta en el auxarchivo - cuando lo uses margintableen 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-notecolumn0.1.2583 deKOMA-Script 3.23.2583 \labelen notas funciona como se esperaba. Y con lo nuevo ya \makenote*no necesitas todo esto . \protectEntonces 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 \sidenoteno puede utilizar \makenote*, porque \thesnmarkdebe ampliarse inmediatamente. Pero puedes usar el \detokenizetruco \makenote*tú mismo como se muestra en el ejemplo anterior.

Por cierto: en el código anterior he corregido varios errores de espacio.

información relacionada