我正在尝试了解\newinsert
及其相关宏如何用于插入脚注之类的内容。我一直在查看latex.ltx
和一些使用自定义插入的其他类(例如memoir.cls
)。但它们对我来说有点复杂。
我脑海中浮现的是类似\sidefootnote
from 的东西memoir.cls
,它使用了这种机制。但它还不够memoir.cls
简单,让我无法跟上正在发生的事情。
我知道这需要调整\output
例程。脚注的输出方式如下:
\ifvoid\footins\else
\unvbox\footins
\fi
但我无法在任何地方输出任何类似的东西\myins
。
有人可以使用以下模板为我提供一个简单的示例吗?
现在,假设文档是单列,并且插入的文本应该像脚注一样从一页流到下一页。
脚注输出在页面底部。我希望\myins
输出在页面的其他地方,例如,从正文顶部开始的侧边距。
该tikz
框只是为了显示插入的文本最终会出现在何处。
(我不确定如何标记这个问题,所以请根据需要进行调整。)
平均能量损失
\documentclass{article}
\usepackage[latin]{babel} % better hyphenation for Lorem ipsum
\usepackage{microtype} % avoid overfull \hbox
\usepackage{lipsum}
\usepackage{tikz} % for sample box
\usepackage[a5paper, top=2cm, left=6.85cm, width=6cm, height=15cm]{geometry}
\newinsert\myins
\pagestyle{empty}
\begin{document}
\lipsum[1]\insert\myins{\lipsum[2]}
% This is where I want the insert to appear
\begin{tikzpicture}[overlay, remember picture, inner sep=1mm, outer sep=0pt]
\node[draw, anchor=north west, text width=3cm, text depth=15cm,
font=\small, minimum width=3.2cm, minimum height=15.2cm]
at ([xshift=1.9cm, yshift=-1.9cm]current page.north west)
{\lipsum[2]};
\end{tikzpicture}
\end{document}
答案1
以下是改编自@Skillmon 的回答做一些你想做的事情(在缺乏足够信息的情况下,我不得不做出决定:我添加了一个sidenote
计数器并对侧注进行了编号;它们垂直堆叠,最多间隔 1 个点。
如您所见,文本确实从一页流向下一页(特别是,插入内容可以拆分)。下面的示例显示了两页之间用连字符连接的边注中的单词。
有一个已知问题(据我所知,Skillmon 的答案也完全一样)。我对这个问题的理解如下:由于 LaTeX\output
例程不知道这种新的浮点数,因此它不会自动刷新尚未在任何页面上找到位置的此类浮点数的队列,无论是在执行时\clearpage
,还是在文档末尾(\end{document}
正是在发出一个\clearpage
以输出悬空浮点数的地方)。这就是为什么在这个例子中,我必须在文档末尾创建一个带有的空白页\clearpage\mbox{}
。没有它,尚未发送的插入内容将保留在 TeX 的内存中,永远不会出现在页面上。
根据 TeXbook 第 125 页,此类“悬空”插入(对于所有浮点类)的总数出现在\insertpenalties
一个\output
例程中。因此,这应该可以修复……通过破解\output
众所周知的棘手的 LaTeX 例程。由于我还没有研究过它(LaTeX\output
例程),所以将此代码视为概念证明。
% Adapted from Skillmon's answer: <https://tex.stackexchange.com/a/526349/73317>
\documentclass{book}
\usepackage{showframe} % only to show that the placement is roughly correct
\usepackage{eso-pic}
\usepackage{lipsum}
\newcounter{sidenote}
\makeatletter
\AddToShipoutPictureBG{\sidenote@handle}
\newinsert\sidenote@ins
\count\sidenote@ins\z@
\skip\sidenote@ins\z@
\dimen\sidenote@ins\textheight
\newenvironment{sidenote}
{%
\ifmmode\else\@bsphack\fi
\insert\sidenote@ins\bgroup
\hsize=\marginparwidth
\linewidth=\hsize
\@afterheading\@afterindentfalse
\refstepcounter{sidenote}%
\normalfont\small \strut \textsuperscript{\thesidenote}%
\ignorespaces
}%
{%
\unskip
\strut\par
\vskip \z@ \@plus 1pt % small amount of stretchability between notes
\egroup
\@Esphack
\ignorespacesafterend % \@ignoretrue in \@Esphack isn't \global
}
\newcommand*\sidenote@handle
{%
\setbox\sidenote@ins\vbox to \textheight
{% Prevent color from bleeding outside the side margin (it will not
% continue to the next page, even if that was desired).
\color@vbox\normalcolor
\vbox to \textheight
{%
\unvbox\sidenote@ins \unskip
\lastbox % set \prevdepth from the last box
% Let descenders from the last line of the side box descend. In
% this example, this won't be visible unless you insert an
% infinitely stretchable skip somewhere in the side note material.
% Indeed, the \vskip \z@ \@plus 0.0001fil always wins against the
% \vskip \z@ \@plus 1pt we insert between footnotes.
\ifdim\prevdepth>\z@
\vskip -\ifdim \prevdepth>\maxdepth \maxdepth \else \prevdepth \fi
\fi
% Fill the remaining space, but let fill and filll “crush” that.
\vskip \z@ \@plus 0.0001fil
}%
\color@endbox
}%
\if@twoside
\ifodd\c@page
\AtTextLowerLeft
{%
\put(\LenToUnit{\dimexpr\textwidth+\marginparsep\relax},0)
{\box\sidenote@ins}%
}%
\else
\AtTextLowerLeft
{%
\put(\LenToUnit{-\dimexpr\marginparsep+\marginparwidth\relax},0)
{\box\sidenote@ins}%
}%
\fi
\else
\AtTextLowerLeftr
{%
\put(\LenToUnit{\dimexpr\textwidth+\marginparsep\relax},0)
{\box\sidenote@ins}%
}%
\fi
}
\makeatother
\begin{document}
\lipsum[1-2]
\begin{sidenote}
\lipsum[1-2]
\end{sidenote}
\begin{sidenote}
\lipsum[3-4] YYY
\end{sidenote}
\lipsum[3-5] XXX
\clearpage\mbox{}
\end{document}
我更新后的代码允许边注底部的下行线低于侧框的底线,正如预期的那样。在上一个示例中根本看不到它,因为提供的边注材料中没有任何跳跃可以抵消用于\vskip \z@ \@plus 0.0001fil
以\raggedbottom
样式填充边注框的跳跃。但是,如果您注释掉这个跳跃(并\par\vspace*{\fill}
在最后一个边注的末尾添加,以便以样式填充它\raggedbottom
)并在边注材料中提供足够的可伸缩性,您将看到下行线下降:
当然,在实际应用中,可能需要适当的\marginparwidth
、可能的字体更改或任何措施,以使 TeX 以合适的方式打包边距中的内容(由于侧边距中的行较短,示例中有许多溢出的 )。您可以在我使用 的地方设置此类参数。这也是打印计数器的地方,以防您想要更改或删除注释的此编号。\sloppy
\hbox
\small
sidenote
颜色实际上不受支持。我的意思是,该\insert
机制可以随意破坏垂直材质,因此这将阻止颜色合法地从一个侧框流向下一个侧框。但我更新后的代码试图避免最严重的问题(它可以防止颜色在侧框后渗出)。