
據我了解(如果我錯了,請糾正我),tufte 類的缺點是旁注不能跨越分頁符。旁注必須在其開始的頁面上結束。
我意識到 KOMA-Script 的最新版本包含一個包scrlayer-notecolumn
,它解決了這個問題:我們可以擁有獨立於分頁符號的旁注。
邊注甚至可以在浮動中使用,但邊注的編號是一個問題。
我們可以在頁邊空白中包含表格和數字,但是頁邊空白中的每個命令都需要一個\protect
.
問題:如何寫出margintabular
像 tufte 類別的環境?我們還需要使用該scrlayer-notecolumn
套件來改進 Tufte 樣式文件嗎?
\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}
答案1
若要在邊注內放置表格,您可以建立非浮動表格環境,例如
\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
}
但有一個問題:似乎aux
從註釋中向文件寫入標籤不起作用,因此在環境\label{tab:secondtable}
內部margintable
不會產生標籤。
奇怪:將標題寫入aux
文件確實有效。
我目前不知道為什麼將標籤寫入文件aux
不起作用,但將lot
條目寫入aux
文件確實有效。儘管如此,您可以aux
在使用時而margintable
不是在製作註釋時使用 hack 將標籤資訊寫入文件中:
\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}
但請注意,仍然存在一個問題:如果筆記移動到另一頁,標籤的頁碼將會錯誤。
更新:從scrlayer-notecolumn
0.1.2583 開始KOMA 腳本 3.23.2583 \label
註釋中確實按預期工作。有了新的,\makenote*
你就不再需要所有這些了\protect
。所以下面的方法確實有效:
\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}
因為\sidenote
你不能使用\makenote*
,因為\thesnmark
需要立即擴展。但您可以使用自己\detokenize
的技巧\makenote*
,如上例所示。
順便說一句:在上面的程式碼中我修復了幾個空格錯誤。