Tufte-ähnliches Design mit Randnotizen über Seitenumbrüche hinweg, oder: Tufte erstellt mit KOMA-Script

Tufte-ähnliches Design mit Randnotizen über Seitenumbrüche hinweg, oder: Tufte erstellt mit KOMA-Script

Soweit ich es verstehe (korrigieren Sie mich, wenn ich falsch liege), besteht ein Nachteil der Tufte-Klassen darin, dass die Randnotizen nicht über einen Seitenumbruch hinausgehen können. Die Randnotizen müssen auf der Seite enden, auf der sie beginnen.

Mir ist aufgefallen, dass eine ziemlich aktuelle Version von KOMA-Script ein Paket enthält scrlayer-notecolumn, das dieses Problem löst: Wir können Randnotizen unabhängig von Seitenumbrüchen haben.

Die Randnotizen funktionieren sogar innerhalb von Floats, aber dann ist die Nummerierung der Randnotizen ein Problem.

Wir können Tabellen und Abbildungen am Rand haben, aber jeder Befehl am Rand benötigt ein \protect.

Frage: Wie schreibt man eine Umgebung margintabularwie in den Tufte-Klassen? Was brauchen wir noch, um Dokumente im Tufte-Stil mit dem scrlayer-notecolumnPaket zu verbessern?

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

Antwort1

Um Tabellen in die Randnotiz einzufügen, können Sie eine Art nicht schwebende Tabellenumgebung erstellen, z. B.

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

Es gibt jedoch ein Problem: Es scheint, dass das Schreiben eines Etiketts in die auxDatei innerhalb einer Notiz nicht funktioniert, sodass \label{tab:secondtable}innerhalb einer margintableUmgebung kein Etikett entstehen würde.

Kurios: Das Schreiben der Überschrift in die auxDatei funktioniert.

auxWarum das Schreiben des Labels in die Datei nicht funktioniert, das Schreiben des lotEintrags in die Datei aber schon , ist mir derzeit nicht klar. Dennoch könnte man mit einem Hack erreichen, dass die Label-Informationen bei der Verwendung statt bei der Notiz auxin die -Datei geschrieben werden :auxmargintable

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

Beachten Sie jedoch, dass dabei immer noch ein Problem besteht: Die Seitenzahl des Etiketts ist falsch, wenn die Notiz auf eine andere Seite verschoben wird.


Update: Ab scrlayer-notecolumn0.1.2583 vonKOMA-Script 3.23.2583 \labelin Notizen funktioniert wie erwartet. Und mit dem neuen \makenote*braucht man das alles nicht \protectmehr. Also funktioniert das Folgende:

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

Sie \sidenotekönnen nicht verwenden \makenote*, da \thesnmarkdies sofort erweitert werden muss. Sie können jedoch den \detokenizeTrick von \makenote*selbst verwenden, wie im obigen Beispiel gezeigt.

BTW: Im obigen Code habe ich mehrere Leerzeichenfehler behoben.

verwandte Informationen