如何让边注彼此相邻?

如何让边注彼此相邻?

我正在排版圣经的一部分,想将经文编号放在页边,而不是将其排版在行内。我使用星号来分隔经文。

对于非常短的诗句,有时两节诗句以同一行开头,因此我会在两行边注上重叠。使用边注是不行的,因为它们是垂直堆叠的,会让读者感到困惑。

目前,我校对了文本并添加了一些额外的空间。但是,如果我更改了线宽或字体大小,我必须再次校对,因为情况可能会发生变化。所以我正在寻找一种自动化的方法来做到这一点。

下面我添加了一个 MWE 来说明我的意思。

\documentclass[9pt,a5paper,twoside=false]{scrbook}
\usepackage{polyglossia}
\usepackage{geometry}
\usepackage{changepage}
\usepackage[colaction]{multicol}
\usepackage{marginnote}

\setmainlanguage{german}

% Footnotes
\deffootnote[1.5em]{1.5em}{1em}{\textsuperscript{\thefootnotemark}\ }

\newcommand{\strong}[1]{\textbf{#1}}

\makeatletter
\strictpagecheck
\let\old@mn@@@marginnote\@mn@@@marginnote
\long\def\@mn@@@marginnote[#1]#2[#3]{%
  \if@twoside
    \checkoddpage%
    \ifoddpage%
      {\begingroup\docolaction{\reversemarginpar}{}{}\old@mn@@@marginnote[{#1}]{#2}[{#3}]\endgroup}%
    \else{%
      {\begingroup\docolaction{}{}{\reversemarginpar}\old@mn@@@marginnote[{#1}]{#2}[{#3}]\endgroup}}%
    \fi%
  \else%
    \begingroup\docolaction{\reversemarginpar}{}{}\old@mn@@@marginnote[{#1}]{#2}[{#3}]\endgroup
  \fi%
}
\makeatother

\newcounter{biblechapter}
\newcounter{bibleverse}[biblechapter]

\newcommand{\marginbiblechapter}{\marginnote{\huge\bfseries\thebiblechapter}[0.6ex]}

\newcommand{\verseseparator}{\textasteriskcentered}
\newcommand{\marginbibleverse}{\verseseparator\marginnote{\small\thebibleverse}}
\newcommand{\omitmarginbibleverse}[1]{(\verseseparator)\marginnote{\small(\thebibleverse)}\footnote{#1}}
\newcommand{\added}[1]{\ensuremath{\langle}#1\ensuremath{\rangle}}

\newcommand{\printbiblechapter}{\marginbiblechapter}
\newcommand{\printbibleverse}{\marginbibleverse}
\newcommand{\omitbibleverse}[1]{\omitmarginbibleverse{#1}}

\newcommand{\book}[2]{\chapter*{#1}}
\makeatletter
\newcount\biblechap@svdopt
\newcount\biblevrs@svdopt
\newcommand{\adjustchapter}[1]{
  \biblechap@svdopt=#1 %
  \ifnum\c@biblechapter=\biblechap@svdopt\else\advance\biblechap@svdopt by -1\fi%
  \setcounter{biblechapter}{\the\biblechap@svdopt}%
}
\newcommand{\adjustverse}[1]{
  \biblevrs@svdopt=#1 %
  \ifnum\c@bibleverse=\biblevrs@svdopt\else\advance\biblevrs@svdopt by -1\fi%
  \setcounter{bibleverse}{\the\biblevrs@svdopt}%
}
\newenvironment{biblechapter}[1][\thebiblechapter]{%
  \adjustchapter{#1}\refstepcounter{biblechapter}\printbiblechapter%
}{}
\renewcommand{\verse}[1][\thebibleverse]{%
  \adjustverse{#1}\refstepcounter{bibleverse}%
  \ifnum\c@bibleverse=1\else\printbibleverse\fi%
}%
\newcommand{\omitverse}[2][\thebibleverse]{%
  \adjustverse{#1}\refstepcounter{bibleverse}%
  \ifnum\c@bibleverse=1\else\omitbibleverse{#2}\fi%
}
\makeatother

\newcommand{\Title}{Das Evangelium nach Markus}

\geometry{
  top=3cm,
  bottom=3cm,
  inner=1.25cm,
  outer=1.25cm,
  footskip=0.7cm,
  marginparsep=0.8em,
}

\title{\Title}
\date{\Date}
\author{\Author}

\begin{document}

\book{\Title}{Markus}

\begin{multicols}{2}%

% Chapter 4
\begin{biblechapter}
\verse Und wieder fing er an, am See zu lehren. Und es versammelt sich eine sehr große Volksmenge zu ihm, so dass er in ein Boot stieg und auf dem See saß; und die ganze Volksmenge war am See auf dem Land.

\verse {…}

\verse Und er spricht zu ihnen: Begreift ihr dieses Gleichnis nicht? Und wie wollt ihr all die Gleichnisse verstehen?

\verse Der Sämann sät das Wort.
\verse Die an dem Weg aber sind die, bei denen das Wort gesät wird und, wenn sie es hören, sogleich der Satan kommt und das Wort wegnimmt, das in sie hinein gesät worden ist.
\verse Und ebenso sind die, die auf das Steinige gesät werden, die, wenn sie das Wort hören, es sogleich mit Freuden aufnehmen,
\verse und sie haben keine Wurzel in sich, sondern sind \added{Menschen} des Augenblicks; wenn nachher Bedrängnis oder Verfolgung um des Wortes willen entsteht, ärgern sie sich sogleich.
\verse Und andere sind die unter die Dornen Gesäten, es sind die, die das Wort gehört haben,
\verse und die Sorgen der Zeit und der Betrug des Reichtums und die Begierden nach den übrigen Dingen kommen hinein und ersticken das Wort, und es bringt keine Frucht.
\verse Und die auf die gute Erde Gesäten sind jene, die das Wort hören und aufnehmen und Frucht bringen: eines dreißig- und eines sechzig- und eines hundert\added{fach}.

\verse {…}

\verse Und wer einem dieser Kleinen, die an mich glauben, Anlass zur Sünde gibt, für den wäre es besser, wenn ein Mühlstein um seinen Hals gelegt und er ins Meer geworfen würde.
\verse Und wenn deine Hand dir Anlass zur Sünde gibt, so hau sie ab! Es ist besser für dich, als Krüppel in das Leben hineinzugehen, als mit zwei Händen in die Hölle zu kommen, in das unauslöschliche Feuer.
\omitverse{Spätere Handschriften ergänzen: wo ihr Wurm nicht stirbt und das Feuer nicht erlischt.}
\verse Und wenn dein Fuß dir Anlass zur Sünde gibt, so hau ihn ab! Es ist besser für dich, lahm in das Leben hineinzugehen, als mit zwei Füßen in die Hölle geworfen zu werden.
\omitverse{Spätere Handschriften ergänzen: in das unauslöschliche Feuer, wo ihr Wurm nicht stirbt und das Feuer nicht erlischt.}
\verse Und wenn dein Auge dir Anlass zur Sünde gibt, so wirf es weg! Es ist besser für dich, einäugig in das Reich Gottes hineinzugehen, als mit zwei Augen in die Hölle geworfen zu werden,
\verse «wo ihr Wurm nicht stirbt und das Feuer nicht erlischt».
\verse Denn jeder wird mit Feuer gesalzen werden.
\end{biblechapter}

\end{multicols}

\end{document}

第 4/5、14/15 和 16/17 节的数字似乎重叠。我已经想到了创建临时变量来存储 y 位置和当前边注框的宽度,并将其与下一个边注的值进行比较。但那时我只能移动第二个,这对右边距来说可能没问题,但对左边距来说不行,因为那样它们会以错误的顺序出现。有没有办法挂接到换行符算法或延迟第一个边注的输出?与换行符的 AddEverypageHook 等效的东西可能是正确的。

我是一个相当优秀的程序员,但是我对 LaTeX 的内部结构了解不够,无法找到自己的道路。

顺便说一句,我正在使用 XeLaTeX,如果这有任何区别的话,因为在最终的文档中会有不同的字体,但我为了举例而删除了它们,因为它们在这里并不重要。

答案1

下面提供的宏功能\marginmerge{<text>}类似于\marginnote,只是它只处理一行文本,并且将(最多)两个重叠的调用合并为一行,并在它们之间插入“/”。

为了节省空间,我没有使用您的“不那么简单的工作示例”。需要注意的是,如果您不使用几何图形,则需要在序言中添加\pdfpageheight=\paperheight和。\pdfpagewidth=\paperwidth

注意:我进入\MMoverlap了一个单独的宏,因为我无法跟踪\if \fi比赛情况。

\documentclass[twocolumn]{article}
\usepackage[showframe]{geometry}
\usepackage{everypage}
%\tracingmacros=1

\newcounter{abspage}
\AddEverypageHook{\MarginMergePage}

\makeatletter
% allocate global registers
\newcount\MM@total
\newcount\MM@index

\newif\ifMM@left
\newif\ifMM@same

\newcommand{\marginmerge}[1]% #1 = text for margin note
{\pdfsavepos
  \protected@write\@auxout{\let\theabspage=\relax}{\string\newmarginmerge{\theabspage}%
    {\noexpand\number\pdflastxpos}{\noexpand\number\pdflastypos}{#1}}%
}%

\newcommand{\newmarginmerge}[4]% #1 = page, #2 = x, #3 = y, #4 = text
{\global\advance\MM@total by \@ne
  \expandafter\gdef\csname MM@page\the\MM@total\endcsname{#1}%
  \expandafter\gdef\csname MM@x\the\MM@total\endcsname{#2}%
  \expandafter\gdef\csname MM@y\the\MM@total\endcsname{#3}%
  \expandafter\gdef\csname MM@text\the\MM@total\endcsname{#4}%
}%

\newcommand{\MarginMergePage}% cursor 1in from top left corner
{\stepcounter{abspage}%
\bgroup% allocate local registers
  \countdef\index=1
  \countdef\next=2
  \dimendef\xleft=0 % left margin
  \dimendef\xright=1 % right margin
  \dimendef\xcenter=2 % between columns
  \dimendef\x=3
  \dimendef\y=4
% locate x offsets
  \ifodd\c@page
    \setlength{\xleft}{\oddsidemargin}%
  \else
    \setlength{\xleft}{\evensidemargin}%
  \fi
  \setlength{\xcenter}{\xleft}%
  \addtolength{\xcenter}{1in}% to left side of page
  \addtolength{\xcenter}{0.5\textwidth}%

  \setlength{\xright}{\xleft}%
  \addtolength{\xright}{\textwidth}%
  \addtolength{\xright}{\marginparsep}%

  \addtolength{\xleft}{-\marginparsep}%
% check for notes
  \MM@lefttrue
  \index=\MM@index
  \loop\ifnum\index<\MM@total
    \advance\index by \@ne
    \edef\theindex{\the\index}%
    \ifnum\value{abspage}<\csname MM@page\theindex\endcsname\relax
      \index=\MM@index
    \else
      \x=\csname MM@x\theindex\endcsname sp\relax
      \ifdim\x>\xcenter \MM@leftfalse\fi
      \y=\csname MM@y\theindex\endcsname sp\relax
      \def\text{\csname MM@text\theindex\endcsname}%
      \MMoverlap% check for overlap
    \fi
  \fi
  \ifnum\index>\MM@index
    \advance\y by -\paperheight
    \advance\y by 1in
    \ifMM@left \raisebox{\y}[0pt][0pt]{\rlap{\hspace{\xleft}\llap{\text}}}%
    \else \raisebox{\y}[0pt][0pt]{\rlap{\hspace{\xright}\text}}%
    \fi
    \global\MM@index=\index
  \repeat
\egroup}

\newcommand{\MMoverlap}{% check for overlap
\ifnum\index<\MM@total\relax
  \next=\index
  \advance\next by \@ne
  \edef\thenext{\the\next}%
  \ifnum\c@page=\csname MM@page\thenext\endcsname\relax
    \MM@sametrue
    \ifMM@left
      \x=\csname MM@x\thenext\endcsname sp\relax
      \ifdim\x>\xcenter \MM@samefalse\fi
    \fi
    \ifMM@same
      \ifdim\y=\csname MM@y\thenext\endcsname sp\relax
        \def\text{\csname MM@text\theindex\endcsname/\csname MM@text\thenext\endcsname}% yes
        \index=\next
      \fi
    \fi
  \fi
\fi}
\makeatother

\begin{document}
\noindent
Left column \marginmerge{\small 1}
with overlap. \marginmerge{2}\\
Not overlapped.\marginmerge{3}

\newpage
\noindent
Right column \marginmerge{4}
with overlap. \marginmerge{5}\\
Not overlapped.\marginmerge{6}
\end{document}

演示

相关内容