如何合并 marginpars 以避免溢出?

如何合并 marginpars 以避免溢出?

我使用边距打印关键字,但有时段落中的关键字数量过多,它们会出现在下一段旁边。为了避免这个问题,我想也许可以这样处理:如果边距中的文本与它们对应的文本在\marginpar同一行上,则用逗号而不是换行符分隔它们。

例如,假设我写道:

Some text A\marginpar{X} and B\marginpar{Y}

在输出中,A 和 B 打印在同一行。然后我想在边距区域显示“X,Y”,而不是一行显示“X”,下一行显示“Y”。

有没有办法修改\marginpar或定义一个新命令来实现这个目的?

答案1

我不知道是否有办法自动完成此操作:我认为 TeX 格式化整个段落的方式,仅在段落完成时决定换行符,会阻止任何简单的本地知识,即两个单词(或插入单词之间的宏)是否会出现在同一行文本上。

但是,我可以提供下一个最佳解决方案:一个宏,它允许您手动(但尽可能简单)确定哪些边注应放在同一个内\marginpar

带有连续边注的宏

以下是两个宏,它们之间只有一个星号不同。虽然必须仔细检查文档才能为命令添加星号,但希望您能轻松找到(或猜出)一些应该添加星号的地方,并适当修改源代码。

句法: \marnote{ ... }或者\marnote*{ ... }

无星号的宏会创建新的边注。有星号的版本会添加要包含在先前定义的边注中的材料。这两个命令都接受其参数,并编写一个命令以从辅助文件中读取,从而构建给定边注的内容。

带星号的版本在辅助文件中写入注释,该注释附加到已包含一些材料的标记列表的末尾。两个版本都获取正在构建的标记列表的内容,并定义一个命名宏来表示所需边注的内容。在编译时,辅助文件将该宏的内容定义为什么,都会进入边注。由于辅助文件的内容可能落后于文档本身,因此每次更改边注后都需要进行几次编译(编辑器可能会或可能不会自动执行)。

代码:

\makeatletter
    \newcounter{marnote}
    \setcounter{marnote}{0}
    \newtoks\marnote@toks
    \def\marnote{\@ifstar{\marnote@continue}{\marnote@new}}
    \def\marnote@new#1{%
        \@bsphack
        \fix@marnote
        \stepcounter{marnote}%
        \expandafter\put@marnote\expandafter{marnote@\the\c@marnote}%
        \protected@write\@auxout{}{\string\newmarnote{#1}}%
        \@esphack}
    \def\marnote@continue#1{%
        \@bsphack\protected@write\@auxout{}{\string\continuemarnote{#1}}\@esphack}
    \def\put@marnote#1{%
        \marginpar{%
            \@ifundefined{#1}%
                {\nfss@text{\reset@font\marnotestyle\bfseries ??}}%
                {\csname #1\endcsname}%
        }}
    \def\fix@marnote{%
        \ifnum\c@marnote>0\protected@write\@auxout{}{\string\savemarnote\the\c@marnote}\fi}
    \def\newmarnote#1{%
        \marnote@toks={\marnotestyle {#1}}}%
    \def\continuemarnote#1{%
        \marnote@toks=\expandafter{\the\marnote@toks\marnotedelim#1}}%
    \def\savemarnote#1{%
        \def\@tempa{\expandafter\gdef\csname marnote@#1\endcsname}%
        \expandafter\@tempa\expandafter{\the\marnote@toks}}%
    \AtEndDocument{\@bsphack\fix@marnote\@esphack}
\makeatother
\newcommand\marnotestyle{\footnotesize}
\newcommand\marnotedelim{, }

请注意最后定义的两个宏,它们允许您修改边注的排版方式。

示例文档

将上述代码包含在以下文档的序言中 — — 或将以下内容复制到新文档中,位于上述边注宏之后。

\documentclass{article}

% For some "dummy" text at the end of the document
\usepackage[english]{babel}
\usepackage{blindtext}

% Some geometric parameters to better show off the margin notes 
\usepackage[right=8cm,textwidth=7cm,marginparwidth=6cm, marginparsep=5mm]{geometry}

% This allows the margin notes to align as well as possible with the lines of text
\setlength\marginparpush{0pt}

\begin{document}

Testing testing one\marnote{one (1)} two three four five six seven
eight\marnote{eight (8)} nine\marnote*{nine (9)} ten eleven twelve
thirteen\marnote*{thirteen (13)} fourteen fifteen sixteen seventeen
eighteen\marnote{eighteen (18)} nineteen twenty. \blindtext[1]

\end{document}

附有连续边注的样本文件

答案2

我认为你可以只使用一个 \marginpar,而不是多个来解决这个问题。只需用逗号分隔每个关键字即可。

相关内容