CTeX-org / forum

A temporarily alternate forum of `bbs.ctex.org`
https://t.me/chinesetex
Apache License 2.0
210 stars 16 forks source link

如何在每一章的指定位置插入边注 #317

Open ROGERDJQ opened 2 months ago

ROGERDJQ commented 2 months ago

检查清单

操作系统

windows10, overleaf

TeX 发行版

TeXlive 2021

描述问题

描述出现的情况

最近在做一个义务排版,是想实现边注的效果。主要是希望实现几个内容:

  1. 实现margin note, 但边注是在每章指定的位置开始top-bottom 依次排列,而不是像marginpar/marginnote那样贴在对应行附近。默认每章有一个起点【因为章首页的首段不是在页面的最上方】
  2. 跨页的边注自动续到下一页。
  3. 支持two side设定。
  4. 本页的边注最好在本页出现。
  5. 边注之间可设置间隔。
  6. 可在正文或边注中插入图片
  7. 边注有note marker,并且在正文中marker 是上标,在边注中是正常大小。

给出您解决问题所进行的尝试

  1. memoir。 发现memoir的sidefootnote非常好用,尝试了下可以满足2,3,5。功能4可能也默认实现了。功能7也可以修改。但是功能1不能实现,默认的sidefootnote是bottom up排列。也没有办法设置起点。 【问题是如何使用memoir中的sidefootnote,但是让其是top down而不是bottom up,并且每章可以设置一个起始高度间隔。】
  2. https://tex.stackexchange.com/questions/70312/how-can-i-replace-footnotes-for-non-floating-marginal-notes?noredirect=1&lq=1 提供了一个方案,是利用了一个新的box ftbox将footin的内容装进去,然后重新排版outpubox和ftbox。这个默认的代码就可以实现1,2,3。功能4看起来也实现了,但我看不懂是怎么实现的,代码中也没有显式的写。功能5我通过加vspace满足了,功能7 也满足了。但是有两个问题,一个功能6在正文中插入图片会导致整个格式都错乱,甚至超出页面范围。 一个是边注区域要么下面不满,或者上面超出正文一点点。【问题是怎么在正文中正常插入图片,改善下边注排满和上面超出的问题。】

给出复现步骤

  1. https://www.overleaf.com/1752198231rgbhcypjqzdr#abdf2f 【memoir实现】
  2. https://www.overleaf.com/8475689682twsnbthvkqsn#4406f7 【方法2,问题出现在第2,3,4页】

最小工作示例(MWE)

\documentclass[book]{memoir} % \let\subsection\section % undo article option change of divisions % \let\section\chapter % ditto \usepackage{mwe} \usepackage{lipsum} \usepackage{graphicx} \usepackage{caption} \usepackage{wrapfig} \usepackage{xcolor} \usepackage{xeCJK} \sidefootmarkstyle{{\color{red}{{#1}}:} } \begin{document} \section{First} 中英文皆可以混排。 sssss這是繁體中文。 \lipsum[2]

Some sidefootnoted text.\sidefootnote{Margined footnote. {\includegraphics[width=0.77\sidefootwidth]{example-image} \captionof{figure}{This is a test case.} }}

\lipsum[4]

Some sidefootnoted textSome sidefootnoted textSome sidefootnoted textSome sidefootnoted text.\sidefootnote{\lipsum[1-3]}Some sidefootnoted textSome sidefootnoted textSome sidefootnoted textSome sidefootnoted text.

\par\begin{wrapfigure}{r}{0.55\textwidth} \centering\vspace{-\baselineskip} \includegraphics[width=0.25\textwidth]{example-image} \caption{SSS} \end{wrapfigure}

\begin{figure}[h] \centering \includegraphics[width=0.25\textwidth]{example-image} \caption{new img} \end{figure} \lipsum[1-3]

\end{document}

- 方法2 实现
```latex
\documentclass[twoside]{ctexbook}
 \usepackage[%
    a4paper,
    left=2cm,
    textheight=14cm,
    textwidth=10cm,
    paperheight=18cm,
    marginparsep=0.5cm,
    marginparwidth=7cm
    ]{geometry}
\usepackage{lipsum}
\usepackage{zhlipsum}
\usepackage{mwe}
\setlength{\footnotesep}{5\baselineskip}
\usepackage{xcolor}
\usepackage{caption}

\newbox\ftbox
\setbox\ftbox\vbox{}  %

  \makeatletter
\long\def\@footnotetext#1{%
  \global\setbox\ftbox\vbox{%
    \unvbox\ftbox

    \reset@font\footnotesize
    \hsize\marginparwidth \@parboxrestore
    \interlinepenalty 50
    \splitmaxdepth \dp\strutbox  \floatingpenalty \@MM
    \protected@edef\@currentlabel{%
      \csname p@footnote\endcsname\@thefnmark
    }
    % \vspace{1pt}
    \color@begingroup
    \@makefntext{%
      #1 
      \@finalstrut\strutbox
    }%
    \color@endgroup
  }%
}
    %  ftbox保存所有的footnotes

% 
\gdef\@makecol{%
  \ifvoid\footins
    \setbox\@outputbox\box\@cclv
  \else
    \setbox\@outputbox\vbox{%
      \boxmaxdepth\@maxdepth
      \unvbox\@cclv
      \vskip\skip\footins
      \color@begingroup
        \normalcolor
        \footnoterule
        \unvbox\footins
      \color@endgroup
    }%
  \fi
   %  有脚注,就解包cclv再合并footins, 没有脚注,就直接设置为cclv,主要设置了outputbox的内容 
   % 前面设置了一个ftbox 放脚注, 这里又有了一个outputbox 放 正文和脚注
  \global\setbox\@ne\vbox{\vsplit\ftbox to\textheight}
  %  这里是切成list还是只是去了第一段呢?剩下的怎么办? 只切了第一段,剩下的还在ftbox中
  % 按照textheight切怎么保证每一页的注释能出现在每一页该在的那一页呢?footnote怎么保证是对应页数的?

  \if@twoside\ifodd\c@page
    \setbox\@outputbox\vbox{%
      \hbox{
        \box\@outputbox
        \rlap{\kern\marginparsep\box\@ne}
      }
    }%
  \else
    \setbox\@outputbox\vbox{%
      \hbox{\llap{\box\@ne\kern\marginparsep}\box\@outputbox}
    }%
  \fi
  \else
    \setbox\@outputbox\vbox{%
      \hbox{\box\@outputbox\rlap{\kern\marginparsep\box\@ne}}
    }%
  \fi
  % 又设置了一遍outputbox里面的内容,似乎\box用完一遍里面就清空了,但是outputbox不是已经有脚注在内了吗?
  \let\@elt\relax
  \xdef\@freelist{\@freelist\@midlist}%
  \global\let\@midlist\@empty
  \@combinefloats
  %  看起来无关的一段
  \ifvbox\@kludgeins
    \@makespecialcolbox
  \else
    \setbox\@outputbox\vbox to \@colht{%
      \@texttop
      \dimen@\dp\@outputbox
      \unvbox\@outputbox
      \vskip-\dimen@
      \@textbottom
    }%
  \fi
  % 又set outbox?但是设置0.5\@colht 也没有看到改变,怎么调整高度?
  % 到底在哪里打印的呢?每一页执行一次吗?

  \global\maxdepth\@maxdepth
}
\makeatother

 \usepackage{wrapfig}
\usepackage{graphicx}

\begin{document}
\chapter{sss1}
\setbox\ftbox\vbox{\vspace{145pt}}
每建马先口住月大,究平克满现易手,省否何安苏京。两今此叫证程事元七调联派业你,全它精据间属医拒严力步青。厂江
内立拉清义边指,况半严回和得话,状整度易芬列。再根心应得信飞住清增,至例联集采家同严热,地手蠢持查受立询。统
定发几满斯究后参边增消与内关,解系之展习历李还也村酸。制周心值示前她志长步反,和果使标电再主它这,即务解旱八
战根交。是中文之象万影报头,与劳工许格主部确,受经更奇小极准。形程记持件志各质天因时,据据极清总命所风式,气
太束书家秀低坟也。期之才引战对已公派及济,间究办儿转情革统将,周类弦具调除声坑。两了济素料切要压,光采用级数
本形,管县任其坚。切易表候完铁今断土马他,领先往样拉口重把处千,把证建后苍交码院眼。较片的集节片合构进,入化
发形机已斯我候,解肃飞口严。技时长次土员况属写,器始维期质离色,个至村单原否易。重铁
\begin{figure}[h!]
    \centering % 表示居中
    \includegraphics[width=4.5cm,height=5cm]{example-image}
    \caption{test} \label{sample-figure}
    \end{figure}
看年程第则于去,且它后基格并下,每收感石形步而

每建马先\footnote{\zhlipsum[1]}口住月大,究平克满现易手,省否何安苏京。两今此叫证程事元七调联派业你,全它精据间属医拒严力步青。厂江内立拉清义边指,况半严回和得话,状整度易芬列。再根心应得信飞住清增,至例联集采家同严热,地手蠢持查受立询。统定发几满斯究后参边增消与内关,解系之展习历李还也村酸。制周心值示前她志长步反,和果使标电再主它这,即务解旱八战根交。是中文之象万影报头\footnote{\zhlipsum[1]},与劳工许格主部确,受经更奇小极准。形程记持件志各质天因时,据据极清总命所风式,气太束书家秀低坟也。期之才引战对已公派及济,间究办儿转情革统将,周类弦具调除声坑。两了济素料切要压,光采用级数本形,管县任其 \zhlipsum[1] \footnote{\zhlipsum[1]}坚。切易表候完铁今断土马他,领先往样拉口重把处千,把证建后苍交码院眼。较片的集节片合构进,入化发形机已斯我候,解肃飞口严。技时长次土员况属写,器始维期质离色,个至村单原否易。重铁看年程第则于去,且它后基格并下,每收感石形步而

水厂共当而面三张,白家决空给意层般,单重总歼者新。每建马先口住月大,究平克满现易手,省否何安苏京。两今此
叫证程事元七调\par\begin{wrapfigure}[4]{r}{0.5\textwidth}
    \centering\vspace{-\baselineskip}
    \includegraphics[width=0.25\textwidth]{example-image}
    \caption{SSS}
\end{wrapfigure} 联派业你,全它精据间属医拒严力步青。厂江内立拉清义边指,况半严回和得话,状整度易芬列。再根心应
得信飞住清增,至例联集采家同严热,地手蠢持查受立询。统定发几满斯究后参边增消与内关,解系之展习历李还也村酸。
制周心值示前她志长步反,和果使标电再主它这,即务解旱八战根交。是中文之象万影报头\footnote{\zhlipsum[1-2]},与劳工许格主部确,受经更奇水厂共当而面三张,白家决空给意层般,单重总歼者新。\footnote{\zhlipsum[1]}每建马先口住月大,究平克满现易手,省否何安苏京。两今此叫证程事元七调联派业你,全它精据间属医拒严力步青。厂江内立拉清义边指,况半严回和得话,状整度易芬列。再根心应得信飞住清增,至例联集采家同严热,地手蠢持查受立询。统定发几满斯究后参边增消与内关,解系之展习历李还也村酸。制周心值示前她志长步反,和果使标电再主它这,即务解旱八
战根交。是中文之象万影报头\footnote{\zhlipsum[1]},与劳工许格主部确,受经更奇小极准。形程记持件志各质天因时,据据极清总命所风式,气太束书家秀低坟也。期之才引战对已公派及济,间究办儿转情革统将,周类弦具调除声坑。两了济素料切要压,光采用级数本形,管县任其坚。切易表候完铁今断土马他,领先往样拉口重把处千,把证建后苍交码院眼。较片集节片合构进,入化发形机已斯我候,解肃飞口严。技时长次土员况属写,器始维期质离色,个至村单原否易。重铁看年程第则于去,且它后基格并下,每收感石形步而

水厂共当而面三张,白家决空给意层般,单重总歼者新。每建马先口住月大,究平克满现易手,省否何安苏京。两今此叫证程事元七调联派业你,全它精据间属医拒严力步青。厂江内立拉清义边指,况半严回和得话,状整度易芬列。再根心应得信飞住清增,至例联集采家同严热,地手蠢持查受立询。统定发几满斯究后参边增消与内关,解系之展习历李还也村酸。制周心值示前她志长步反,和果使标电再主它这,即务解旱八战根交。是中文之象万影报头\footnote{\zhlipsum[1-2]},与劳工许主部确,受经更奇

\zhlipsum[1]

水厂共当而面三张,白家决空给意层般,单重总歼者新。每建马先口住月大,究平克满现易手,省否何安苏京。两今此
叫证程事元七调联派业你,全它精据间属医拒严力步青。厂江内立拉清义边指,况半严\begin{figure}[h!]
    \centering % 表示居中
    \includegraphics[width=2cm,height=5cm]{example-image}
    \caption{test} \label{sample-figure}
    \end{figure}回和得话,状整度易芬列。再根心应得信飞住清增,至例联集采家同严热,地手蠢持查受立询。统定发几满斯究后参边增消与内关,解系之展习历李还也村酸。制周心值示前她志长步反,和果使标电再主它这,即务解旱八战根交。是中文之象万影报头\footnote{\zhlipsum[1-2]\includegraphics[width=0.77\linewidth]{example-image}
    \captionof{figure}{This is a test case.}
    \label{fig:test}},与劳工许格主部确,受经更奇

\end{document}

用 XeLaTeX 编译后,日志文件输出【请见附件】

链接

其他信息

我还做了这些尝试:

  1. marginnote, marginpar都是贴在对应行的边注,而不是top down依次排列的边注;而且有时候边注之间还会重叠,需要手动调节offset,而且也没有counter计数边注,整个功能不是很对应marginnote/marginpar的初衷。
  2. footmisc有一个side选项,但是查看了文档后发现是套用marginpar实现的。
  3. https://tex.stackexchange.com/questions/69517/send-and-stack-marginpar-to-the-top-or-the-bottom-of-the-page 提供了一套方案,但是不满足“跨页的边注会自动续到下一页”,也不支持two-side。
  4. paracol, 这种随时随地 能切换multi col和单栏的设定很好,但是考虑到把单独 的一栏都用来放边注,而且还要对齐,还要设置counter计数,感觉和paracol的设计也对不上。
  5. Tufte-LATEX, 它 的边注好用,但是边注之间的offset要自己调节,默认还是贴在对应行的边注。

附件

log.md

muzimuzhi commented 2 months ago

你的两个例子都编不通,无论是复制到本地还是在 Overleaf 上编译

ROGERDJQ commented 2 months ago

你的两个例子都编不通,无论是复制到本地还是在 Overleaf 上编译

  • memoir 实现:\normalise 未定义
  • 方法2 实现:\captionof 未定义(可能是 caption 包没加载)
  • 两个实现里的 test.png 可以换成 mwe 包提供的示例图片,如 example-image

谢谢指正,确实是有问题,把这两处都修改了,麻烦试下新的。

muzimuzhi commented 2 months ago

看宏包描述,marginfix 很接近你想要的效果,可以试试看。https://ctan.org/pkg/marginfix

ROGERDJQ commented 2 months ago

看宏包描述,marginfix 很接近你想要的效果,可以试试看。https://ctan.org/pkg/marginfix

我看描述感觉正好覆盖需求, 但是试了下发现还是mrginpar的标注,默认和对应的行对齐,不能top down的。

---------------------------------------------------------插入图片的方法------------------------------------------- \begin{center} \includegraphics[width=0.77\textwidth]{example-image} \captionof{figure}{一张边注占位图} \end{center} } 不过下午尝试了下,可以在方法2 里正常插入图片了。其实就是套了一个 begin{center}, 也不知道为啥 work了。能力有限,感觉目前暂时也足够了。 别的需求可以后面慢慢学慢慢改。

muzimuzhi commented 2 months ago

我看描述感觉正好覆盖需求, 但是试了下发现还是mrginpar的标注,默认和对应的行对齐,不能top down的。

原来你说的 "top down" 是这个意思。能介绍为什么不需要边注默认和对应的行对齐吗?

原来你说的「插入图片」是带标题的图片。是什么应用场景,使得在边注的图片也需要标题?

ROGERDJQ commented 2 months ago

确实是个有些奇怪的需求: )。我其实是想实现https://www.douban.com/group/topic/205073382/?_i=4313704_iIZOth 这个排版。然后我分析了下:

  1. 一列是正文,一列是边注。我觉得“不需要边注默认和对应的行对齐”大概率是因为边注太多了,一章就有70-80个边注,有的边注还非常长,而且他这本书的特色还就是突出注释多。
  2. 正文和边注里的图片都需要有标题。【可能图多也显得注释多吧】

其实细看下来,感觉他的排版是双栏的,因为像下面的附图中的正文图片,也影响了边注的布局。不过难度太大了,能有目前的效果就很不错了。 image

muzimuzhi commented 2 months ago

看起来是一种特殊的版式,为了能排下篇幅比正文还长的注释。

这两类页面,一个是正文-边注模式,一个是双栏模式。如果都按正文-边注实现,那么没法排版两栏都是注释的页面。

你(本来)准备怎么排版第二类页面?


感觉需要修改 shipout 逻辑,比如在正常正文-边注模式 shipout 一页后,判断如果等待输出的注释内容积累到一定高度,就输出一个专门的注释页面。不知道 flowfram 包帮不帮得上。

复刻的角度,文本是确定的,仿佛可以接受手动调整;但考虑到三卷本总页数过千,而且文本一致,未必能让换行和换页位置也一致(即使用了相同的字体字号、页面局部),还是需要尽量自动。

ROGERDJQ commented 2 months ago

很多细节我都没注意到,我又仔细对了下,确实是有二类。一类是正文-边注模式,正文栏宽于注释栏;一类是双栏模式,是纯注释,并且双栏注释都是比较细的宽度,但是保证了外侧栏的out margin始终是不变的。图片的位置也的确如您所说,无编号,有描述,描述统一居中排列。

原文的注释和正文是不同颜色的字体,我都没注意到,还以为第 11 页的书影也是正文-边注模式,还好您指出来了。另外除了这两个模式外,还有一个我不知道是不是应该拿出来说,就是每一章的首页,因为章首页在章标题的位置是不分栏的,横跨整个页面宽度。从章标题以下,正文开始就分栏了。这导致要设置一个边注的起始位置,同时分栏前是横跨页面的。下面暂时叫做章首页模式。


我原先只注意到正文-边注模式,章首页模式,以及图片和文字的绕排情况。当时查到目前的解决方案,并且结合代码研读之后,我注意到一些冲突。

首先如果实现章首页模式,最好的效果是类似paracol那样的随时随地开启分栏,但这样每个边注都要手动记号,手动排位置,而且图片 也不能实现绕排【看他文档的实例是没有实现绕排的】;其次如果按目前的方案实现正文-边注模式,该方案本质是把footnote都搜集起来又重新装进一个vbox里面,就等于一页的布局其实是两个水平并置的 box,正文栏中图片的排版怎么样都无法影响到注释栏的box,而又由于一页是两个vbox,也很难实现章首页。

我当时觉得已经超出自己能力的范围, 最后我只能先保证正文-边注模式可以实现。这种情况下,章首页模式中页面宽度的章标题被放在了正文栏box中,我改成了靠左对齐,以防止居中对齐会被看出来分栏,然后通过在边注box中手动预置一个vspace,让其能和第一段文本对齐;图片 的 绕排也只能保证在本box内可以顺利插入图片。


第二类页面【双栏模式】,目前我想不到该怎么排。主要的困难:

  1. 该如何确定下一页是双栏模式还是正文-边注模式?这个感觉只有排完了当前页,并且还能预知后面内容的情况下才能做到。好像是有一个注释box, 排版每一页的时候都需要知道目前这个盒子里面【在下一个带边注的正文前的所有边注】的量有多少,足够一页就排一页,或许超过半页就应该排一页双栏。我在实际排的时候还发现,有些时候会出现注释太少,当前页只有正文栏,注释栏没内容的 情况。
  2. 图片绕排的问题,如果是要实现图片绕排,我感觉不能是两个封闭的box,可能需要什么机制让他们能互相感知,绕开图片的位置。我昨天找到一个wrapfirgure,在 单栏中还挺好用的,但是多栏还得试一下。
  3. 多栏的排版。是否正文-边注和双栏模式是不同的设计?因为正文-边栏模式要让边注尽量出现在对应正文的那一页,边注和正文间存在某种align的联系,双栏模式似乎就默认排列就行。

感觉在面对大问题,没有什么头绪,逻辑上只想到了上面的困难。 我先从您说的flowfram看起 。